home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 July / EnigmA AMIGA RUN 20 (1997)(G.R. Edizioni)(IT)[!][issue 1997-07 & 08][EAR-CD IV].iso / earcd / disk / cdrom / playtrac.lha / Source / PlayTrack.s next >
Text File  |  1997-04-16  |  63KB  |  3,463 lines

  1.     include    'exec/types.i'
  2.     include    'exec/memory.i'
  3.     include    'exec/interrupts.i'
  4.     include    'exec/io.i'
  5.     include    'exec/libraries.i'
  6.     include 'exec/execbase.i'
  7.     include    'exec/exec_lib.i'
  8.     include    'graphics/gfxbase.i'
  9.     include    'graphics/displayinfo.i'
  10.     include    'intuition/intuition.i'
  11.     include 'intuition/intuition_lib.i'
  12.     include    'devices/audio.i'
  13.     include    'devices/scsidisk.i'
  14.     include    'hardware/custom.i'
  15.     include    'hardware/intbits.i'
  16.     include    'hardware/dmabits.i'
  17.     include    'hardware/adkbits.i'
  18.     include    'hardware/cia.i'
  19.     include    'graphics/graphics_lib.i'
  20.     include    'dos/dos.i'
  21.     include    'dos/dos_lib.i'
  22.     include    'audio_driver.i'
  23.     include    'resource.i'
  24.  
  25. UNKNOWN        EQU    -1
  26. APPLECD300    EQU    0
  27. APPLECD150    EQU    1
  28. TOSHIBA3401    EQU    2
  29.  
  30. CDDA_BLOCKSIZE    EQU    2352
  31. TOC_SIZE    EQU    804
  32.  
  33.     STRUCTURE dq_DiskQueue,0
  34.         APTR    dq_prev
  35.         UWORD    dq_itemNo
  36.         LABEL    dq_SIZEOF
  37.  
  38.     STRUCTURE s_TrackNode,0
  39.         APTR     tn_prev
  40.         APTR    tn_next
  41.         UWORD    tn_trackNo
  42.         ULONG    tn_startBlock
  43.         ULONG    tn_endBlock
  44.         LABEL    tn_SIZEOF
  45.  
  46.  
  47.     STRUCTURE lin_LineNode,0
  48.         APTR    lin_next
  49.         APTR    lin_string
  50.         LABEL    lin_SIZEOF
  51.  
  52.     section audio_code,code
  53.  
  54. ;**********************************************************************
  55.  
  56. Start:
  57.  
  58.     bsr    StartResource
  59.     move.l    a0,d0
  60.     bsr    ListCommand
  61.     tst.l    d0
  62.     beq    sta_1
  63.     move.l    d0,line_Str
  64.     
  65.     bsr    ReadPrefs    
  66.     bsr    OpenSCSI
  67.     bsr    OpenAudio
  68.     bsr    ReadTracks    
  69.     
  70.     move.l    line_Str(pc),d0
  71. sta_3    tst.l    end_Prog
  72.     beq    sta_E
  73.     move.l    d0,a5
  74.     move.l    lin_string(a5),a0
  75.     bsr    atoi
  76.     tst.l    a0
  77.     beq    sta_1
  78.     move.l    d0,d7
  79.  
  80.     move.l    d7,d0
  81.     bsr    GetTrack
  82.     tst.l    d0
  83.     beq    sta_2
  84.     bsr    PlayCDROM
  85.     
  86.     move.l    lin_next(a5),d0
  87.     bne    sta_3
  88.     
  89. sta_E    bsr    FreeAll
  90.     rts
  91.  
  92. sta_1    lea    UsageMessage(pc),a0
  93.     bsr    NotifyError
  94.     bra    sta_E
  95.     
  96. sta_2    lea    sta_errMsg(pc),a0
  97.     bsr    NotifyError
  98.     bra    sta_E
  99.  
  100. line_Str    dc.l    0
  101. end_Prog    dc.l    1
  102.  
  103. BufBlocks    dc.l    2
  104. UsageMessage    dc.b    'Usage: PlayTrack <track numbers e.g. 1 2 3>',0
  105. sta_errMsg    dc.b    'Specified track not found.',0
  106.  
  107. ;**********************************************************************
  108.  
  109.     cnop    0,4
  110.  
  111.     ;d0    =    track structure
  112.  
  113. PlayCDROM:
  114.  
  115.     movem.l    d0-d7/a0-a6,-(sp)
  116.     move.l    d0,a0
  117.     move.l    tn_startBlock(a0),currentBlock
  118.     move.l    tn_endBlock(a0),endBlock
  119.     bsr    ActivateNewResource
  120.     move.l    d0,playRes
  121.     move.l    4.w,a6
  122.     suba.l    a1,a1
  123.     jsr    _LVOFindTask(a6)
  124.     move.l    d0,thisTask
  125.     move.l    d0,a1
  126.     moveq    #27,d0
  127.     jsr    _LVOSetTaskPri(a6)
  128.     moveq    #2,d3
  129.     lea    ReadCmd(pc),a2
  130.     lea    AudioSignals(pc),a3
  131.     lea    diskQueue(pc),a4
  132. PCD_1    moveq    #12,d0
  133.     move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  134.     moveq    #E_PLACE|E_FATALERROR,d2
  135.     bsr    GetMem
  136.     move.l    d0,(a2,d3.w*4)
  137.     moveq    #-1,d0
  138.     moveq    #E_PLACE|E_FATALERROR,d1
  139.     bsr    NewSignal
  140.     move.b    d0,(a3,d3.w)
  141.     moveq    #dq_SIZEOF,d0
  142.     move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  143.     moveq    #E_PLACE|E_FATALERROR,d2
  144.     bsr    GetMem
  145.     move.l    d0,(a4,d3.w*4)
  146.     dbra    d3,PCD_1
  147. PCD_2a    moveq    #0,d7
  148.     lea    ReadCmd(pc),a5
  149.     lea    ASyncIO(pc),a4
  150. PCD_2    move.l    currentBlock(pc),d0
  151.     cmp.l    endBlock(pc),d0
  152.     bhi    PCD_E
  153.     move.l    (a4,d7.w*4),a0
  154.     move.l    (a5,d7.w*4),a1
  155.     move.b    scsi_readCmd(pc),(a1)
  156.     move.b    #0,1(a1)
  157.     move.l    d0,2(a1)
  158.     move.l    BufBlocks(pc),d1
  159.     move.l    d1,6(a1)
  160.     move.b    #0,10(a1)
  161.     move.b    #0,11(a1)
  162.     add.l    d1,d0
  163.     move.l    d0,currentBlock
  164.     moveq    #12,d0
  165.     lea    audioBuffers(pc),a2
  166.     move.l    (a2,d7.w*4),a2
  167.     mulu.l    #CDDA_BLOCKSIZE,d1
  168.     moveq    #SCSIF_READ,d2
  169.     moveq    #0,d3
  170.     lea    readCmd_msg(pc),a3
  171.     bsr    DoSCSI
  172.     tst.l    d0
  173.     beq    PLP_Err
  174.     lea    diskQueue(pc),a1
  175.     move.l    (a1,d7.w*4),a1
  176.     move.l    topDiskQ(pc),d0
  177.     beq    PCD_3
  178.     move.l    d0,a0
  179.     move.l    a1,dq_prev(a0)
  180.     bra    PCD_4
  181. PCD_3    move.l    a1,bottomDiskQ
  182. PCD_4    move.l    a1,topDiskQ
  183.     clr.l    dq_prev(a1)
  184.     move.w    d7,dq_itemNo(a1)
  185.     addq.w    #1,d7
  186.     cmpi.w    #3,d7
  187.     bcs    PCD_2
  188.     bsr    PlayLoop
  189. PCD_E    
  190.     bsr    FlushStream
  191.     move.l    _DOSBase(pc),a6
  192.     move.l    BufBlocks(pc),d1
  193.     mulu.l    #10,d1
  194.     jsr    _LVODelay(a6)
  195.  
  196.     move.l    playRes(pc),d0
  197.     bsr    RemoveResource
  198.     movem.l    (sp)+,d0-d7/a0-a6
  199.     rts
  200.  
  201. ;**********************************************************************
  202.  
  203. PlayLoop:
  204.  
  205.     moveq    #0,d7        ;d7    =    signal
  206.     bra    PLP_8
  207.     
  208. PLP_1    move.l    currentBlock(pc),d0
  209.     cmp.l    endBlock(pc),d0
  210.     bhi    PLP_E
  211.     move.l    d7,d6
  212.     moveq    #0,d2
  213.     moveq    #0,d0
  214.     lea    AudioSignals(pc),a0
  215.     moveq    #2,d3
  216. PLP_2    move.b    (a0)+,d2
  217.     moveq    #1,d1
  218.     lsl.l    d2,d1
  219.     or.l    d1,d0
  220.     dbra    d3,PLP_2
  221.     
  222.     ori.l    #SIGBREAKF_CTRL_D|SIGBREAKF_CTRL_C,d0
  223.     move.l    4.w,a6
  224.     
  225.     jsr    _LVOWait(a6)
  226.  
  227.     move.l    d0,d7
  228.     or.l    d6,d7
  229.     move.l    d7,d6
  230.     andi.l    #SIGBREAKF_CTRL_D,d6
  231.     bne    PLP_E
  232.     
  233.     move.l    d7,d6
  234.     andi.l    #SIGBREAKF_CTRL_C,d6
  235.     beq    PLP_4ac
  236.     clr.l    end_Prog
  237.     bra    PLP_E
  238.     
  239. PLP_4ac    moveq    #0,d5
  240. PLP_4    lea    AudioSignals(pc),a0
  241.     moveq    #1,d0
  242.     moveq    #0,d1
  243.     move.b    (a0,d5.w),d1
  244.     lsl.l    d1,d0
  245.     move.l    d7,d6
  246.     and.l    d0,d6
  247.     beq    PLP_5
  248.     eor.l    d0,d7
  249.     lea    ASyncIO(pc),a0
  250.     move.l    (a0,d5.w*4),a0
  251.     lea    ReadCmd(pc),a1
  252.     move.l    (a1,d5.w*4),a1
  253.     move.b    scsi_readCmd(pc),(a1)
  254.     move.b    #0,1(a1)
  255.     move.l    currentBlock(pc),d0
  256.     move.l    BufBlocks(pc),d1
  257.     move.l    d0,2(a1)
  258.     move.l    d1,6(a1)
  259.     add.l    d1,d0
  260.     move.l    d0,currentBlock
  261.     moveq    #12,d0
  262.     mulu.l    #CDDA_BLOCKSIZE,d1
  263.     lea    audioBuffers(pc),a2
  264.     move.l    (a2,d5.w*4),a2
  265.     moveq    #SCSIF_READ,d2
  266.     moveq    #0,d3
  267.     lea    readCmd_msg(pc),a3
  268.     bsr    DoSCSI
  269.     tst.l    d0
  270.     beq    PLP_Err
  271.     
  272.     lea    diskQueue(pc),a1
  273.     move.l    (a1,d5.w*4),a1
  274.     move.l    topDiskQ(pc),d0
  275.     beq    PLP_6
  276.     move.l    d0,a0
  277.     move.l    a1,dq_prev(a0)
  278.     bra    PLP_7
  279. PLP_6    move.l    a1,bottomDiskQ
  280. PLP_7    move.l    a1,topDiskQ
  281.     clr.l    dq_prev(a1)
  282.     move.w    d5,dq_itemNo(a1)
  283. PLP_5    addq.w    #1,d5
  284.     cmpi.w    #3,d5
  285.     bcs    PLP_4
  286.         
  287. PLP_8    move.l    bottomDiskQ(pc),d0
  288.     beq    PLP_9
  289.     move.l    d0,a0
  290.     move.w    dq_itemNo(a0),d5
  291.     
  292.     move.l    dq_prev(a0),d0
  293.     move.l    d0,bottomDiskQ
  294.     bne    PLP_10
  295.     clr.l    topDiskQ
  296.     
  297. PLP_10    bsr    _SD_Lock
  298.     move.l    qualityNumber(pc),d4
  299.     lea    audioBuffers(pc),a0
  300.     move.l    (a0,d5.w*4),a0
  301.     move.l    a0,a1
  302.     add.l    #2,a1
  303.     move.l    BufBlocks(pc),d0
  304.     mulu.l    #CDDA_BLOCKSIZE,d0
  305.     moveq    #4,d1
  306.     mulu.w    d4,d1
  307.     divu.l    d1,d0
  308.     move.l    d4,d1
  309.     lsl.l    #1,d1
  310.     subq.w    #1,d1
  311.     move.l    #44100,d2
  312.     divu.l    d4,d2
  313.     moveq    #0,d6
  314.     lea    AudioSignals(pc),a3
  315.     move.b    (a3,d5.w),d6
  316.     move.l    d6,a2
  317.     bsr    _ProvideStream
  318.     bsr    _SD_Unlock
  319.     bra    PLP_8
  320.     
  321. PLP_9    bra    PLP_1
  322. PLP_E    rts
  323.  
  324. PLP_Err
  325.  
  326.     lea    readErr(pc),a0
  327.     bsr    FatalError
  328.     rts
  329.  
  330. AudioFunc:
  331.  
  332.     movem.l    d0-d7/a0-a6,-(sp)
  333.     move.l    a5,d0
  334.     move.l    d0,signalVal
  335.     moveq    #1,d1
  336.     lsl.l    d0,d1
  337.     move.l    d1,d0
  338.     move.l    thisTask(pc),a1
  339.     move.l    4.w,a6
  340.     jsr    _LVOSignal(a6)
  341.     movem.l    (sp)+,d0-d7/a0-a6
  342.     rts
  343.     
  344. qualityNumber    dc.l    2
  345. signalVal    dc.l    0
  346.  
  347. currentBlock    dc.l    0
  348. endBlock    dc.l    0
  349.     
  350. playRes        dc.l    0
  351.  
  352. topDiskQ    dc.l    0
  353. bottomDiskQ    dc.l    0
  354. diskQueue    dc.l    0,0,0
  355.  
  356. ReadCmd        dc.l    0,0,0
  357. AudioSignals    dc.b    0,0,0,0
  358. thisTask    dc.l    0
  359.  
  360. scsi_readCmd    dc.b    $d8
  361.  
  362. readCmd_msg    dc.b    'Reading data from CDDA.',0
  363. readErr        dc.b    'Error reading CDDA data.',0
  364.  
  365. ;**********************************************************************
  366.  
  367.     cnop    0,4
  368.  
  369.     ;a0    =    string
  370.     ;return d0    =    number
  371.     ;    a0    =    0=FALSE
  372.  
  373. atoi:
  374.     move.l    d1,-(sp)
  375.     moveq    #0,d0
  376.     moveq    #0,d1
  377. atoi_2    move.b    (a0)+,d1
  378.     beq    atoi_1
  379.     mulu.l    #10,d0
  380.     cmpi.w    #$30,d1
  381.     blt    atoi_E
  382.     cmpi.w    #$39,d1
  383.     bgt    atoi_E
  384.     andi.w    #$000f,d1
  385.     add.l    d1,d0
  386.     bra    atoi_2
  387. atoi_1    move.l    (sp)+,d1
  388.     rts
  389.     
  390. atoi_E    move.l    (sp)+,d1
  391.     suba.l    a0,a0
  392.     rts
  393.  
  394. ;**********************************************************************
  395.  
  396. ReadPrefs:
  397.  
  398.     movem.l    d0/a0-a1/a5,-(sp)
  399.     lea    rp_PrefsFilename(pc),a0
  400.     move.l    a0,d0
  401.     bsr    ParseCommandFile
  402.     move.l    d0,a5
  403.     lea    rp_device(pc),a0
  404.     move.l    a5,a1
  405.     bsr    FindStringValue
  406.     tst.l    d0
  407.     beq    RP_1
  408.     move.l    d0,scsi_namePtr
  409. RP_1    lea    rp_unit(pc),a0
  410.     move.l    a5,a1
  411.     bsr    FindStringValue
  412.     tst.l    d0
  413.     beq    RP_2
  414.     move.l    d0,a0
  415.     bsr    atoi
  416.     tst.l    a0
  417.     beq    RP_2
  418.     move.l    d0,scsi_unit
  419. RP_2    lea    rp_quality(pc),a0
  420.     move.l    a5,a1
  421.     bsr    FindStringValue
  422.     tst.l    d0
  423.     beq    RP_3
  424.     move.l    d0,a0
  425.     bsr    atoi
  426.     tst.l    a0
  427.     beq    RP_3
  428.     move.l    d0,qualityNumber
  429. RP_3    movem.l    (sp)+,d0/a0-a1/a5
  430.     rts
  431.  
  432. rp_device    dc.b    'DEVICE',0
  433. rp_unit        dc.b    'UNIT',0
  434. rp_quality    dc.b    'QUALITY',0
  435. rp_PrefsFilename    dc.b    'S:playtrack.prefs',0
  436.  
  437. ;**********************************************************************
  438.  
  439.     cnop    0,4
  440.  
  441.     ;a0    =    parameter string
  442.     ;a1    =    string list
  443.  
  444. FindStringValue:
  445.  
  446.     movem.l    d1-d2/d7/a2-a3,-(sp)
  447.     moveq    #0,d7
  448. FSV_1    tst.l    a1
  449.     beq    FSV_2
  450.     move.l    lin_string(a1),a2
  451.     move.l    a0,a3
  452.     moveq    #0,d0
  453. FSV_3    move.b    (a2)+,d1
  454.     beq    FSV_4
  455.     move.b    (a3)+,d2
  456.     beq    FSV_4
  457.     cmpi.b    #'=',d1
  458.     beq    FSV_4
  459.     sub.b    d2,d1
  460.     addx.b    d1,d0
  461.     bra    FSV_3
  462. FSV_4    tst.l    d0
  463.     beq    FSV_5
  464.     move.l    lin_next(a1),a1
  465.     bra    FSV_1
  466. FSV_5    move.l    a2,d7
  467. FSV_2    move.l    d7,d0
  468.     movem.l    (sp)+,d1-d2/d7/a2-a3
  469.     rts
  470.  
  471.  
  472. ;**********************************************************************
  473.  
  474.     ;d0    =    Prefs file name
  475.  
  476. ParseCommandFile:
  477.  
  478.     movem.l    d1-d5/a0-a6,-(sp)
  479.     move.l    d0,d1
  480.     bsr    ActivateNewResource
  481.     move.l    d0,prefsRes
  482.     move.l    #MODE_OLDFILE,d2
  483.     moveq    #E_PLACE|E_FATALERROR,d3
  484.     bsr    OpenFile
  485.     move.l    d0,d5
  486.     move.l    #228+32,d0
  487.     move.l    #MEMF_PUBLIC,d1
  488.     moveq    #E_PLACE|E_FATALERROR,d2
  489.     bsr    GetMem
  490.     move.l    d0,a5
  491.     move.l    _DOSBase(pc),a6
  492.     move.l    d5,d1
  493.     move.l    d0,d2
  494.     jsr    _LVOExamineFH(a6)
  495.     tst.w    d0
  496.     bne    PCF_1
  497.     lea    pcf_Err1(pc),a0
  498.     bsr    FatalError
  499. PCF_1    move.l    fib_Size(a5),d0
  500.     move.l    d0,d4
  501.     addq.l    #1,d0
  502.     move.l    #MEMF_PUBLIC,d1
  503.     moveq    #E_PLACE|E_FATALERROR,d2
  504.     bsr    GetMem
  505.     move.l    d0,a4
  506.     move.l    d5,d1
  507.     move.l    d0,d2
  508.     move.l    d4,d3
  509.     jsr    _LVORead(a6)
  510.     cmp.l    d0,d4
  511.     beq    PCF_2
  512.     lea    pcf_Err2(pc),a0
  513.     bsr    FatalError
  514. PCF_2    suba.l    a5,a5
  515.     moveq    #1,d3
  516.     subq.l    #1,d4
  517. PCF_3    cmpi.b    #' ',(a4)
  518.     beq    PCF_4
  519.     cmpi.b    #$0a,(a4)
  520.     beq    PCF_4
  521.     tst.b    d3
  522.     beq    PCF_5
  523.     moveq    #lin_SIZEOF,d0
  524.     move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  525.     moveq    #E_PLACE|E_FATALERROR,d2
  526.     bsr    GetMem
  527.     tst.l    a5
  528.     beq    PCF_6
  529.     move.l    d0,lin_next(a3)
  530.     bra    PCF_7
  531. PCF_6    move.l    d0,a5
  532. PCF_7    move.l    d0,a3
  533.     move.l    a4,lin_string(a3)
  534.     moveq    #0,d3
  535.     bra    PCF_5
  536. PCF_4    moveq    #1,d3
  537.     clr.b    (a4)
  538. PCF_5    lea    1(a4),a4
  539.     dbra    d4,PCF_3
  540.     clr.b    (a4)
  541.     move.l    a5,d0
  542.     movem.l    (sp)+,d1-d5/a0-a6
  543.     rts
  544.  
  545. prefsRes    dc.l    0
  546.  
  547. pcf_Err1    dc.b    'Could not file information from file.',0
  548. pcf_Err2    dc.b    'Unexpected end of file',0
  549.  
  550. ;**********************************************************************
  551.  
  552.     cnop    0,4
  553.  
  554.     ;d0    =    command line
  555.     
  556. ListCommand:
  557.  
  558.     movem.l    d1-d3/a3-a5,-(sp)
  559.     move.l    d0,a5
  560.     bsr    ActivateNewResource
  561.     move.l    d0,listRes
  562.     suba.l    a4,a4
  563.     moveq    #1,d3
  564. LC_6    cmpi.b    #' ',(a5)
  565.     beq    LC_1
  566.     cmpi.b    #$0a,(a5)
  567.     beq    LC_3
  568.     tst.b    d3
  569.     beq    LC_2
  570.     moveq    #lin_SIZEOF,d0
  571.     move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  572.     moveq    #E_PLACE|E_FATALERROR,d2
  573.     bsr    GetMem
  574.     tst.l    a4
  575.     beq    LC_4
  576.     move.l    d0,lin_next(a3)
  577.     bra    LC_5
  578. LC_4    move.l    d0,a4
  579. LC_5    move.l    d0,a3
  580.     move.l    a5,lin_string(a3)
  581.     moveq    #0,d3
  582.     bra    LC_2
  583. LC_1    moveq    #1,d3
  584.     clr.b    (a5)
  585. LC_2    lea    1(a5),a5
  586.     bra    LC_6
  587. LC_3    clr.b    (a5)
  588.     move.l    a4,d0
  589.     movem.l    (sp)+,d1-d3/a3-a5
  590.     rts
  591.     
  592. listRes        dc.l    0
  593.  
  594. ;**********************************************************************
  595.  
  596. ReadTracks:
  597.     
  598.     movem.l    d0-d2/d5-d7/a0-a6,-(sp)
  599.     bsr    ActivateNewResource
  600.     move.l    d0,trackRes
  601.     move.l    #804,d0
  602.     move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  603.     moveq    #E_FATALERROR,d2
  604.     bsr    GetMem
  605.     move.l    d0,a5
  606.     move.l    d0,TOCData
  607.     move.l    SyncIO(pc),a0
  608.     lea    TOCRead(pc),a1
  609.     move.l    a5,a2
  610.     lea    TOCmsg(pc),a3
  611.     moveq    #10,d0
  612.     move.l    #804,d1
  613.     moveq    #SCSIF_READ,d2
  614.     moveq    #0,d3
  615.     bsr    DoSCSI
  616.     tst.l    d0
  617.     beq    RT_3
  618.     moveq    #0,d7
  619.     moveq    #4,d6
  620.     moveq    #8,d5
  621.     move.l    a5,a4
  622.     add.l    d6,a4
  623.     move.b    3(a5),d7
  624.     move.b    2(a5),d6
  625. RT_1    subq.w    #1,d7
  626.     subq.w    #1,d6
  627.     beq    RT_2
  628.     add.l    d5,a4
  629.     bra    RT_1
  630. RT_2    tst.w    d7
  631.     blt    RT_3
  632.     suba.l    a3,a3
  633. RT_2a    moveq    #tn_SIZEOF,d0
  634.     move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  635.     moveq    #E_PLACE|E_FATALERROR,d2
  636.     bsr     GetMem
  637.     move.l    d0,a2
  638.     move.l    a3,tn_prev(a2)
  639.     tst.l    a3
  640.     beq    RT_2b
  641.     move.l    a2,tn_next(a3)
  642.     bra    RT_2c
  643. RT_2b    move.l    a2,trackList
  644. RT_2c    move.w    d6,tn_trackNo(a2)
  645.     move.l    4(a4),tn_startBlock(a2)
  646.     move.l    d0,-(sp)
  647.     move.l    12(a4),d0
  648.     subi.l    #15,d0
  649.     move.l    d0,tn_endBlock(a2)
  650.     move.l    (sp)+,d0
  651.     move.l    a2,a3
  652.     add.l    d5,a4
  653.     addq.w    #1,d6
  654.     dbra    d7,RT_2a
  655. RT_3    move.l    4.w,a6
  656.     move.l    a5,a1
  657.     move.l    #804,d0
  658.     jsr    _LVOFreeMem(a6)
  659.     movem.l    (sp)+,d0-d2/d5-d7/a0-a6
  660.     rts
  661.  
  662. TOCData        dc.l    0
  663.  
  664. TOCRead        dc.b    $43,0
  665.         dc.l    0
  666.         dc.b    0,TOC_SIZE>>8,(TOC_SIZE&$ff),0
  667.  
  668. trackList    dc.l    0
  669. trackRes    dc.l    0
  670.  
  671. TOCmsg        dc.b    'Reading Table of Contents',0
  672.  
  673. ;**********************************************************************
  674.  
  675.     cnop    0,4
  676.  
  677.     ;d0    =    trackNo
  678.     ;return    =    trackEntry
  679.     
  680. GetTrack:
  681.  
  682.     move.l    a0,-(sp)
  683.     subq.w    #1,d0
  684.     move.l    trackList(pc),a0
  685. GT_2    tst.l    a0
  686.     beq    GT_1
  687.     cmp.w    tn_trackNo(a0),d0
  688.     beq    GT_1
  689.     move.l    tn_next(a0),a0
  690.     bra    GT_2
  691. GT_1    move.l    a0,d0
  692.     move.l    (sp)+,a0
  693.     rts
  694.  
  695. ;**********************************************************************
  696.  
  697. OpenAudio:
  698.  
  699.     movem.l    d0-d2/d6-d7/a5,-(sp)
  700.     bsr    InitDriver
  701.     tst.w    d0
  702.     beq    OA_E
  703.     move.l    #CDDA_BLOCKSIZE>>2,d0
  704.     moveq    #4,d1
  705.     bsr    SetBuffers
  706.     tst.w    d0
  707.     beq    OA_E
  708.     move.l    #$49313662,d0
  709.     bsr    StreamFormat
  710.     tst.l    d0
  711.     beq    OA_E
  712.     move.l    BufBlocks(pc),d7
  713.     mulu.l    #CDDA_BLOCKSIZE,d7
  714.     moveq    #0,d6
  715.     lea    audioBuffers(pc),a5
  716. OA_1    move.l    d7,d0
  717.     move.l    #MEMF_CLEAR,d1
  718.     moveq    #E_PLACE|E_FATALERROR,d2
  719.     bsr    GetVec
  720.     move.l    d0,(a5,d6.w*4)
  721.     addq.w    #1,d6
  722.     cmpi.w    #3,d6
  723.     bne    OA_1
  724.     movem.l    (sp)+,d0-d2/d6-d7/a5
  725.     rts
  726.     
  727. OA_E    lea    audioErr(pc),a0
  728.     bsr    FatalError
  729.     rts
  730.  
  731. audioBuffers    dc.l    0,0,0
  732.  
  733. audioErr    dc.b    'Could not open audio device',0
  734.  
  735. ;**********************************************************************
  736.  
  737. OpenSCSI:
  738.  
  739.     movem.l    d0-d7/a0-a6,-(sp)
  740.     bsr    ActivateNewResource
  741.     move.l    d0,scsiRes
  742.     moveq    #E_PLACE|E_FATALERROR,d0
  743.     bsr    R_NewMsgPort
  744.     move.l    d0,SyncPort
  745.     move.l    d0,a0
  746.     moveq    #48,d0
  747.     moveq    #E_PLACE|E_FATALERROR,d1
  748.     bsr    R_NewIORequest
  749.     move.l    d0,SyncIO
  750.     move.l    d0,a2
  751.     moveq    #30,d0
  752.     move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  753.     moveq    #E_PLACE|E_FATALERROR,d2
  754.     bsr    GetMem
  755.     move.l    d0,SyncCmd
  756.     move.l    d0,a3
  757.     moveq    #38,d0
  758.     move.w    d0,26(a3)
  759.     move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  760.     moveq    #E_PLACE|E_FATALERROR,d2
  761.     bsr    GetMem
  762.     move.l    d0,SyncSense
  763.     move.l    d0,22(a3)
  764.     move.l    a3,40(a2)
  765.     move.l    scsi_namePtr(pc),a0
  766.     move.l    a2,a1
  767.     lea    SyncUse(pc),a2
  768.     move.l    scsi_unit(pc),d0
  769.     moveq    #0,d1
  770.     moveq    #E_PLACE|E_FATALERROR,d2
  771.     bsr    OpenDeviceRes
  772.     moveq    #0,d7
  773. OSC_1    moveq    #E_PLACE|E_FATALERROR,d0
  774.     bsr    R_NewMsgPort
  775.     lea    ASyncPort(pc),a0
  776.     move.l    d0,(a0,d7.w*4)
  777.     move.l    d0,a0
  778.     moveq    #48,d0
  779.     moveq    #E_PLACE|E_FATALERROR,d1
  780.     bsr    R_NewIORequest
  781.     lea    ASyncIO(pc),a0
  782.     move.l    d0,(a0,d7.w*4)
  783.     move.l    d0,a2
  784.     moveq    #30,d0
  785.     move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  786.     moveq    #E_PLACE|E_FATALERROR,d2
  787.     bsr    GetMem
  788.     lea    ASyncCmd(pc),a0
  789.     move.l    d0,(a0,d7.w*4)
  790.     move.l    d0,a3
  791.     moveq    #38,d0
  792.     move.w    d0,26(a3)
  793.     move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  794.     moveq    #E_PLACE|E_FATALERROR,d2
  795.     bsr    GetMem
  796.     lea    ASyncSense(pc),a0
  797.     move.l    d0,(a0,d7.w*4)
  798.     move.l    d0,22(a3)
  799.     move.l    a3,40(a2)
  800.     move.l    scsi_namePtr(pc),a0
  801.     move.l    a2,a1
  802.     lea    ASyncUse(pc),a2
  803.     add.l    d7,a2
  804.     move.l    scsi_unit(pc),d0
  805.     moveq    #0,d1
  806.     moveq    #E_PLACE|E_FATALERROR,d2
  807.     bsr    OpenDeviceRes
  808.     addq.w    #1,d7
  809.     cmpi.w    #3,d7
  810.     bne    OSC_1
  811.     bsr    FindDriveBrand
  812.     cmpi.w    #TOSHIBA3401,d0
  813.     bne    OS_E
  814.     move.b    #$a8,scsi_readCmd
  815.     move.l    SyncIO(pc),a0
  816.     lea    ModeSense(pc),a1
  817.     moveq    #6,d0
  818.     lea    OldModePage,a2
  819.     moveq    #12,d1
  820.     moveq    #SCSIF_READ,d2
  821.     moveq    #0,d3
  822.     lea    OS_modeS(pc),a3
  823.     bsr    DoSCSI
  824.     move.l    SyncIO(pc),a0
  825.     lea    ModeSelect(pc),a1
  826.     moveq    #6,d0
  827.     lea    NewModePage(pc),a2
  828.     moveq    #12,d1
  829.     moveq    #SCSIF_WRITE,d2
  830.     moveq    #0,d3
  831.     lea    OS_modeSel(pc),a3
  832.     bsr    DoSCSI
  833.     lea    SCSIChangeMode(pc),a0
  834.     move.l    a0,d2
  835.     moveq    #R_FUNCTION,d0
  836.     moveq    #rl_SIZEOF,d1
  837.     bsr    Res_PlaceList
  838. OS_E    movem.l    (sp)+,d0-d7/a0-a6
  839.     rts
  840.     
  841.     
  842. SCSIChangeMode:
  843.     
  844.     movem.l    d0-d3/a0-a3,-(sp)
  845.     move.l    SyncIO(pc),a0
  846.     lea    ModeSelect(pc),a1
  847.     moveq    #6,d0
  848.     lea    OldModePage,a2
  849.     moveq    #12,d1
  850.     moveq    #SCSIF_WRITE,d2
  851.     moveq    #0,d3
  852.     lea    OS_oldS(pc),a3
  853.     bsr    DoSCSI
  854.     movem.l    (sp)+,d0-d3/a0-a3
  855.     rts
  856.     
  857.  
  858. scsiRes        dc.l    0
  859.  
  860. SyncPort    dc.l    0
  861. SyncIO        dc.l    0
  862. SyncCmd        dc.l    0
  863. SyncSense    dc.l    0
  864.  
  865. ASyncPort    dc.l    0,0,0
  866. ASyncIO        dc.l    0,0,0
  867. ASyncCmd    dc.l    0,0,0
  868. ASyncSense    dc.l    0,0,0
  869.  
  870. SyncUse        dc.b    0
  871. ASyncUse    dc.b    0,0,0
  872.  
  873. ModeSense    dc.b    $1a,0,1,0,12,0
  874. ModeSelect    dc.b    $15,$10,0,0,12,0
  875. NewModePage    dc.b    0,0,0,8,$82,0,0,0
  876.         dc.l    CDDA_BLOCKSIZE
  877. OS_modeS    dc.b    'reading mode page',0
  878. OS_modeSel    dc.b    'selecting CDDA data format',0
  879. OS_oldS        dc.b    'reseting data format',0
  880.  
  881. scsi_namePtr    dc.l    scsi_name
  882. scsi_name    dc.b    'gvpscsi.device',0
  883. scsi_unit    dc.l    3
  884.     
  885. ;**********************************************************************
  886.  
  887.     cnop    0,4
  888.     
  889.     ;return        =    d0
  890.  
  891. FindDriveBrand:
  892.  
  893.     movem.l    d1-d2/d6-d7/a0-a3/a5-a6,-(sp)
  894.     moveq    #UNKNOWN,d6
  895.     move.l    #1000,d7
  896.     move.l    d7,d0
  897.     move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  898.     moveq    #E_FATALERROR,d2
  899.     bsr    GetMem
  900.     move.l    d0,a5
  901.     move.l    SyncIO(pc),a0
  902.     lea    fdb_inqCmd(pc),a1
  903.     moveq    #6,d0
  904.     move.l    a5,a2
  905.     move.l    d7,d1
  906.     moveq    #SCSIF_AUTOSENSE|SCSIF_READ,d2
  907.     moveq    #0,d3
  908.     lea    fdb_inqCmdName(pc),a3
  909.     bsr    DoSCSI
  910.     tst.w    d0
  911.     beq    FDB_1
  912.     adda.l    #8,a5
  913.     move.l    a5,a0
  914.     lea    fdb_apple300ID(pc),a1
  915.     moveq    #APPLECD300,d6
  916.     bsr    FDB_MCmp
  917.     tst.l    d0
  918.     beq    FDB_2
  919.     move.l    a5,a0
  920.     lea    fdb_apple150ID(pc),a1
  921.     moveq    #APPLECD150,d6
  922.     bsr    FDB_MCmp
  923.     tst.l    d0
  924.     beq    FDB_2
  925.     move.l    a5,a0
  926.     lea    fdb_toshibaID(pc),a1
  927.     moveq    #TOSHIBA3401,d6
  928.     bsr    FDB_MCmp
  929.     tst.l    d0
  930.     beq    FDB_2
  931.     moveq    #UNKNOWN,d6
  932. FDB_2    suba.l    #8,a5
  933. FDB_1    move.l    a5,a1
  934.     move.l    d7,d0
  935.     move.l    4.w,a6
  936.     jsr    _LVOFreeMem(a6)
  937.     move.l    d6,d0
  938.     movem.l    (sp)+,d1-d2/d6-d7/a0-a3/a5-a6
  939.     rts
  940.  
  941.  
  942. FDB_MCmp:
  943.  
  944.     moveq    #0,d0
  945.     moveq    #0,d1
  946. FDB_M1    move.b    (a0)+,d1
  947.     beq    FDB_ME
  948.     move.b    (a1)+,d2
  949.     beq    FDB_ME
  950.     subx.b    d2,d1
  951.     add.l    d1,d0
  952.     bra    FDB_M1
  953. FDB_ME    rts
  954.     
  955.     cnop    0,4
  956.  
  957. fdb_inqCmd    dc.b    $12,0,0,0,252,0
  958.  
  959. fdb_inqCmdName    dc.b    'Reading drive type',0
  960. fdb_apple300ID    dc.b    'SONY    CD-ROM CDU-8003',0
  961. fdb_apple150ID    dc.b    'SONY    CD-ROM CDU-8002',0
  962. fdb_toshibaID    dc.b    'TOSHIBA',0
  963.  
  964.  
  965. ;**********************************************************************
  966.  
  967.     cnop    0,4
  968.  
  969.  
  970.     ;return TRUE/FALSE    =    d0
  971.  
  972. InitDriver:
  973.  
  974.     movem.l    d1-d7/a0-a6,-(sp)
  975.     
  976.     bsr    ActivateNewResource
  977.     move.l    d0,audioRes
  978.     
  979.     moveq    #E_PLACE|E_RETRYERROR,d0
  980.     bsr    R_NewMsgPort
  981.     tst.l    d0
  982.     bne    ID_1
  983.     bsr    E_CloseDriver
  984.     bra    ID_R
  985.     
  986. ID_1    move.l    d0,AudioReply
  987.     move.l    d0,a0
  988.     moveq    #ioa_SIZEOF,d0
  989.     moveq    #E_PLACE|E_RETRYERROR,d1
  990.     bsr    R_NewIORequest
  991.     tst.l    d0
  992.     bne    ID_2
  993.     bsr    E_CloseDriver
  994.     bra    ID_R
  995.     
  996. ID_2    move.l    d0,AudioRequest
  997.     move.l    d0,a1
  998.     move.b    #127,$9(a1)
  999.     move.b    #$40,$1e(a1)
  1000.     lea    ChannelMap(pc),a0
  1001.     move.l    a0,$22(a1)
  1002.     move.l    #1,$26(a1)
  1003.     lea    audio_name(pc),a0    
  1004.     lea    audDeviceUse(pc),a2
  1005.     moveq    #0,d0
  1006.     moveq    #0,d1
  1007.     moveq    #E_PLACE|E_RETRYERROR,d2
  1008.     bsr    OpenDeviceRes
  1009.     tst.l    d0
  1010.     beq    ID_3
  1011.     bsr    E_CloseDriver
  1012.     bra    ID_R
  1013.     
  1014. ID_3    move.l    #(65536*2),d0
  1015.     moveq    #0,d1
  1016.     moveq    #E_PLACE|E_RETRYERROR,d2
  1017.     bsr    GetVec
  1018.     tst.l    d0
  1019.     bne    ID_4
  1020.     bsr    E_CloseDriver
  1021.     bra    ID_R
  1022.     
  1023. ID_4    move.l    d0,ConversionTable
  1024.     move.l    d0,a2
  1025.     move.l    #256,d0
  1026.     moveq    #0,d1
  1027.     moveq    #E_PLACE|E_RETRYERROR,d2
  1028.     bsr    GetVec
  1029.     tst.l    d0
  1030.     bne    ID_5
  1031.     bsr    E_CloseDriver
  1032.     bra    ID_R
  1033.     
  1034. ID_5    move.l    d0,AdditiveTable
  1035.     move.l    d0,a3
  1036.     lea    audioCalbName(pc),a0
  1037.     move.l    a0,d1
  1038.     move.l    #MODE_OLDFILE,d2
  1039.     move.l    _DOSBase(pc),a6
  1040.     jsr    _LVOOpen(a6)
  1041.     move.l    d0,d7
  1042.     beq    ID_6
  1043.     move.l    d0,d1
  1044.     move.l    a3,d2
  1045.     move.l    #256,d3
  1046.     jsr    _LVORead(a6)
  1047.     cmpi.w    #256,d0
  1048.     beq    ID_7
  1049.     
  1050. ID_6    move.w    #254,d0
  1051.     move.l    a3,a0
  1052. ID_6a    move.b    #$55,(a0)+
  1053.     dbra    d0,ID_6a
  1054.     move.b    #$7f,(a0)+
  1055.  
  1056. ID_7    tst.l    d7
  1057.     beq    ID_8
  1058.     move.l    d7,d1
  1059.     jsr    _LVOClose(a6)
  1060.     
  1061. ID_8    move.l    a2,a0
  1062.     move.l    a3,a1
  1063.     bsr    CreateTable
  1064.     move.l    #'M16b',CurrentFormat
  1065.     
  1066.     move.l    #$dff000,a5
  1067.     move.w    #DMAF_AUDIO,$96(a5)
  1068.     move.w    #$00ff,$9e(a5)
  1069.     moveq    #INTB_AUD0,d0
  1070.     lea    NOPVector(pc),a4
  1071.     move.l    a4,a1
  1072.     move.l    4.w,a6
  1073.     jsr    _LVOSetIntVector(a6)
  1074.     move.l    d0,OldAudVector0
  1075.     moveq    #INTB_AUD1,d0
  1076.     move.l    a4,a1
  1077.     jsr    _LVOSetIntVector(a6)
  1078.     move.l    d0,OldAudVector1
  1079.     moveq    #INTB_AUD2,d0
  1080.     move.l    a4,a1
  1081.     jsr    _LVOSetIntVector(a6)
  1082.     move.l    d0,OldAudVector2
  1083.     lea    AudioVector(pc),a1
  1084.     moveq    #INTB_AUD3,d0
  1085.     jsr    _LVOSetIntVector(a6)
  1086.     move.l    d0,OldAudVector3
  1087.     move.w    #$0780,$9a(a5)
  1088.     move.w    #$0780,$9c(a5)
  1089.     move.w    #$8400,$9a(a5)
  1090.     
  1091.     moveq    #R_FUNCTION,d0
  1092.     moveq    #rl_SIZEOF,d1
  1093.     lea    DeInitDriver(pc),a0
  1094.     move.l    a0,d2
  1095.     bsr    Res_PlaceList
  1096.         
  1097.     move.l    #1024,d0
  1098.     moveq    #16,d1
  1099.     bsr    SetBuffers
  1100.     tst.l    d0
  1101.     beq    ID_R
  1102.     
  1103.     moveq    #1,d7
  1104.     
  1105. ID_R    movem.l    (sp)+,d1-d7/a0-a6
  1106.     rts
  1107.  
  1108. audioRes    dc.l    0
  1109.  
  1110.  
  1111. audio_name    dc.b    'audio.device',0
  1112. audioCalbName    dc.b    'ENV:CyberSound/SoundDrivers/14Bit_Calibration',0
  1113.     
  1114.     cnop    0,4
  1115.  
  1116. ErrorAdr    dc.l    0
  1117. ErrorStack    dc.l    0
  1118.     
  1119. AudioReply    dc.l    0
  1120. AudioRequest    dc.l    0
  1121.  
  1122. ConversionTable    dc.l    0
  1123. AdditiveTable    dc.l    0
  1124. CurrentFormat    dc.l    'M16b'
  1125. OldAudVector0    dc.l    0
  1126. OldAudVector1    dc.l    0
  1127. OldAudVector2    dc.l    0
  1128. OldAudVector3    dc.l    0
  1129. NestLevel    dc.w    0
  1130. DriverFlags    dc.w    FLGF_NEEDIRQ
  1131.  
  1132. ChannelMap    dc.b    15
  1133.  
  1134. AudioVector    dc.l    0,0
  1135.         dc.b    NT_INTERRUPT
  1136.         dc.b    0
  1137.         dc.l    int_Name
  1138.         dc.l    0
  1139.         dc.l    AudioInterrupt
  1140.         
  1141. NOPVector    dc.l    0,0
  1142.         dc.b    NT_INTERRUPT
  1143.         dc.b    0
  1144.         dc.l    int_Name
  1145.         dc.l    0
  1146.         dc.l    NOPInterrupt
  1147.  
  1148. audDeviceUse    dc.b    0
  1149.  
  1150. int_Name    dc.b    '14 bit driver',0
  1151. ID_err1        dc.b    'Could not open audio device',0
  1152.  
  1153. ;**********************************************************************
  1154.  
  1155.     cnop    0,4
  1156.  
  1157. @DeInitDriver
  1158. _DeInitDriver
  1159. DeInitDriver:
  1160.  
  1161.     movem.l    d0-d1/a0-a1/a6,-(sp)
  1162.     bsr    FreeBuffers
  1163.     move.l    4.w,a6
  1164.     move.w    #$0780,$dff09a
  1165.     move.w    #$0780,$dff09c
  1166.     tst.l    OldAudVector0
  1167.     beq    DID_1
  1168.     move.l    #INTB_AUD0,d0
  1169.     move.l    OldAudVector0(pc),a1
  1170.     jsr    _LVOSetIntVector(a6)
  1171. DID_1    tst.l    OldAudVector1
  1172.     beq    DID_2
  1173.     move.l    #INTB_AUD1,d0
  1174.     move.l    OldAudVector1(pc),a1
  1175.     jsr    _LVOSetIntVector(a6)
  1176. DID_2    tst.l    OldAudVector2
  1177.     beq    DID_3
  1178.     move.l    #INTB_AUD2,d0
  1179.     move.l    OldAudVector2(pc),a1
  1180.     jsr    _LVOSetIntVector(a6)
  1181. DID_3    tst.l    OldAudVector3
  1182.     beq    DID_4
  1183.     move.l    #INTB_AUD3,d0
  1184.     move.l    OldAudVector3(pc),a1
  1185.     jsr    _LVOSetIntVector(a6)
  1186. DID_4    movem.l    (sp)+,d0-d1/a0-a1/a6
  1187.     rts
  1188.  
  1189.  
  1190. ;**********************************************************************
  1191.  
  1192.     ;audiosize    =    d0
  1193.     ;queuesize    =    d1
  1194.     
  1195.     ;success    =    d0
  1196.  
  1197. _SetBuffers
  1198. @SetBuffers
  1199. SetBuffers
  1200.  
  1201.     movem.l    d2/d5-d7/a0-a1/a6,-(sp)
  1202.     bsr    FreeBuffers
  1203.     move.l    d0,BUFFER_SIZE
  1204.     move.l    d0,d7
  1205.     move.l    d7,RIGHT_MSB
  1206.     lsl.l    #1,d7
  1207.     move.l    d7,RIGHT_LSB
  1208.     add.l    d0,d7
  1209.     move.l    d7,LEFT_LSB
  1210.     move.l    d1,QUEUE_SIZE
  1211.     moveq    #0,d7
  1212.     lsl.l    #2,d0
  1213.     mulu.l    #sia_SIZEOF,d1
  1214.     move.l    d0,d5
  1215.     move.l    d1,d6
  1216.     move.l    #MEMF_CHIP,d1
  1217.     moveq    #E_RETRYERROR,d2
  1218.     bsr    GetVec
  1219.     move.l    d0,DMABuffer1
  1220.     bne    SB_1
  1221.     bsr    E_CloseDriver
  1222.     bra    SB_R
  1223. SB_1    move.l    d5,d0
  1224.     move.l    #MEMF_CHIP,d1
  1225.     moveq    #E_RETRYERROR,d2
  1226.     bsr    GetVec
  1227.     move.l    d0,DMABuffer2
  1228.     bne    SB_2
  1229.     bsr    E_CloseDriver
  1230.     bra    SB_R
  1231. SB_2    move.l    d6,d0
  1232.     move.l    #MEMF_CLEAR,d1
  1233.     moveq    #E_RETRYERROR,d2
  1234.     bsr    GetVec
  1235.     move.l    d0,QueueBuffer
  1236.     bne    SB_3
  1237.     bsr    E_CloseDriver
  1238.     bra    SB_R
  1239. SB_3    bsr    FlushStream
  1240.     moveq    #1,d0
  1241. SB_R    movem.l    (sp)+,d2/d5-d7/a0-a1/a6
  1242.     rts    
  1243.     
  1244. DMABuffer1    dc.l    0
  1245. DMABuffer2    dc.l    0
  1246. QueueBuffer    dc.l    0
  1247. BUFFER_SIZE    dc.l    0
  1248. QUEUE_SIZE    dc.l    0
  1249. LEFT_MSB    dc.l    0
  1250. RIGHT_MSB    dc.l    0
  1251. RIGHT_LSB    dc.l    0
  1252. LEFT_LSB    dc.l    0
  1253.  
  1254. ;**********************************************************************
  1255.  
  1256. FreeBuffers
  1257.  
  1258.     movem.l    d0-d1/a0-a1/a6,-(sp)
  1259.     move.l    4.w,a6
  1260.     bsr    _FlushStream
  1261.     move.l    DMABuffer1(pc),a1
  1262.     tst.l    a1
  1263.     beq    FB_1
  1264.     jsr    _LVOFreeVec(a6)
  1265.     clr.l    DMABuffer1
  1266. FB_1    move.l    DMABuffer2(pc),a1
  1267.     tst.l    a1
  1268.     beq    FB_2
  1269.     jsr    _LVOFreeVec(a6)
  1270.     clr.l    DMABuffer2
  1271. FB_2    move.l    QueueBuffer(pc),a1
  1272.     tst.l    a1
  1273.     beq    FB_3
  1274.     jsr    _LVOFreeVec(a6)
  1275.     clr.l    QueueBuffer
  1276.     clr.l    BUFFER_SIZE
  1277.     clr.l    QUEUE_SIZE
  1278. FB_3    movem.l    (sp)+,d0-d1/a0-a1/a6
  1279.     rts
  1280.  
  1281. ;**********************************************************************
  1282.  
  1283. E_CloseDriver:
  1284.  
  1285.     lea    audio_eMsg(pc),a0
  1286.     bsr    NotifyError
  1287.     move.l    audioRes(pc),d0
  1288.     bsr    RemoveResource
  1289.     moveq    #0,d0
  1290.     rts
  1291.  
  1292. audio_eMsg    dc.b    'Error in audio device:',$0a,'shutting audio down.',0
  1293.  
  1294. ;**********************************************************************
  1295.  
  1296.     cnop    0,4
  1297.  
  1298.     ;d0    =    format
  1299.     ;result    =    d0
  1300.  
  1301. _StreamFormat
  1302. @StreamFormat    
  1303. StreamFormat
  1304.     
  1305.     movem.l    d1/d7,-(sp)
  1306.     bsr    FlushStream
  1307.     moveq    #0,d7
  1308.     move.l    CurrentFormat(pc),d1
  1309.     cmpi.l    #'M16b',d0
  1310.     bne    SF_1
  1311.     cmpi.l    #'I16b',d1
  1312.     bne    SF_1
  1313.     bra    SF_2
  1314. SF_1    cmpi.l    #'I16b',d0
  1315.     bne    SF_3
  1316.     cmpi.l    #'M16b',d1
  1317.     bne    SF_3
  1318. SF_2    bsr    SwapEndian
  1319.     move.l    d0,CurrentFormat
  1320.     moveq    #1,d7
  1321. SF_3    move.l    d7,d0
  1322. SF_E    movem.l    (sp)+,d1/d7
  1323.     rts
  1324.  
  1325.  
  1326. ;**********************************************************************
  1327.  
  1328. _AskFrequency
  1329. @AskFrequency
  1330. AskFrequency
  1331.  
  1332.     movem.l    d1/a6,-(sp)
  1333.     bsr    AskPeriod
  1334.     move.l    4.w,a6
  1335.     move.l    $238(a6),d1
  1336.     mulu.l    #5,d1
  1337.     divu.l    d0,d1
  1338.     move.l    d1,d0
  1339. AF_E    movem.l    (sp)+,d1/a6
  1340.     rts
  1341.  
  1342.  
  1343. ;**********************************************************************
  1344.  
  1345.     ;d0    =    frequency
  1346.     ;peroid    =    d0
  1347.     
  1348. AskPeriod
  1349.  
  1350.     movem.l    d1-d2/a0,-(sp)
  1351.     move.l    _GfxBase,a0
  1352.     move.w    $ce(a0),d1
  1353.     andi.w    #$0004,d1
  1354.     beq    AP_1
  1355.     move.l    #3546895,d1
  1356.     bra    AP_2
  1357. AP_1    move.l    #3579545,d1    
  1358. AP_2    divu.l    d0,d1
  1359.     move.l    d1,d0
  1360.     movem.l    (sp)+,d1-d2/a0
  1361.     rts
  1362.  
  1363. ;**********************************************************************
  1364.  
  1365.     ;a0    =    left
  1366.     ;a1    =    right
  1367.     ;d0    =    samples
  1368.     ;d1    =    interleave
  1369.     ;d2    =    frequency
  1370.     ;a2    =    callback
  1371.     ;d6    =    offset
  1372.     
  1373.     ;result    =    d0
  1374.  
  1375. _ProvideStream
  1376. @ProvideStream
  1377.  
  1378.     movem.l    d3-d5/d7/a3,-(sp)
  1379.     moveq    #0,d7
  1380.     move.l    QueueBuffer(pc),a3
  1381.     tst.l    a3
  1382.     beq    PS_1
  1383.     tst.l    DMABuffer1
  1384.     beq    PS_1
  1385.     tst.l    DMABuffer2
  1386.     beq    PS_1
  1387.     move.l    ProvidePos(pc),d3
  1388.     move.l    d3,d5
  1389.     addq.w    #1,d3
  1390.     divul.l    QUEUE_SIZE(pc),d4:d3
  1391.     cmp.l    PlayPos(pc),d4
  1392.     beq    PS_1
  1393.     bsr    _SD_Lock
  1394.     mulu.l    #sia_SIZEOF,d5
  1395.     add.l    d5,a3
  1396.     move.l    a0,sia_left(a3)
  1397.     move.l    a1,sia_right(a3)
  1398.     move.l    d0,sia_samples(a3)
  1399.     move.w    d1,sia_interleave(a3)
  1400.     move.l    d2,d0
  1401.     bsr    AskPeriod
  1402.     move.l    d0,sia_period(a3)
  1403.     move.l    a2,sia_callback(a3)
  1404.     move.l    d4,ProvidePos
  1405.     move.w    DriverFlags(pc),d0
  1406.     moveq    #FLGF_NEEDIRQ,d1
  1407.     and.w    d0,d1
  1408.     beq    PS_2
  1409.     not.w    d1
  1410.     and.w    d1,d0
  1411.     move.w    d0,DriverFlags
  1412.     move.w    #$8400,$dff09c
  1413. PS_2    bsr    _SD_Unlock
  1414.     moveq    #1,d7    
  1415. PS_1    move.l    d7,d0
  1416. PS_E    movem.l    (sp)+,d3-d5/d7/a3
  1417.     rts
  1418.     
  1419. ProvidePos    dc.l    0
  1420. PlayPos        dc.l    0
  1421.  
  1422. ;**********************************************************************
  1423.  
  1424. _FlushStream
  1425. @FlushStream
  1426. FlushStream
  1427.     
  1428.     tst.l    QueueBuffer
  1429.     beq    FS_E
  1430.     movem.l    d0,-(sp)
  1431.     moveq    #FLGF_FLUSH,d0
  1432.     or.w    d0,DriverFlags
  1433.     move.w    #$8400,$dff09c
  1434.     move.w    #1,$dff0a6
  1435.     move.w    #1,$dff0b6
  1436.     move.w    #1,$dff0c6
  1437.     move.w    #1,$dff0d6
  1438.     movem.l    (sp)+,d0
  1439. FS_E    rts
  1440.  
  1441. ;**********************************************************************
  1442.  
  1443. @PauseStream
  1444. _PauseStream
  1445.     
  1446.     move.w    d0,-(sp)
  1447.     move.w    #FLGF_PAUSE,d0
  1448.     or.w    d0,DriverFlags
  1449.     move.w    d0,(sp)+
  1450.     rts
  1451.  
  1452. ;**********************************************************************
  1453.  
  1454. @ResumeStream
  1455. _ResumeStream
  1456.  
  1457.     movem.w    d0-d1,-(sp)
  1458.     move.w    #~(FLGF_PAUSE),d0
  1459.     move.w    DriverFlags(pc),d1
  1460.     and.w    d0,d1
  1461.     move.w    d1,d0
  1462.     andi.w    #FLGF_NEEDIRQ,d0
  1463.     beq    RS_1
  1464.     move.w    #~(FLGF_NEEDIRQ),d0
  1465.     and.w    d0,d1
  1466.     move.w    #$8400,$dff09c
  1467. RS_1    move.w    d1,DriverFlags
  1468.     movem.w    (sp)+,d0-d1
  1469.     rts
  1470.  
  1471. ;**********************************************************************
  1472.  
  1473. _StopDMA
  1474. @StopDMA
  1475. StopDMA
  1476.  
  1477.     move.w    d0,-(sp)
  1478.     move.w    DriverFlags(pc),d0
  1479.     btst    #FLGB_PLAYING,d0
  1480.     beq    SDMA_1
  1481.     andi.w    #~(FLGF_PLAYING),d0
  1482.     ori.w    #FLGF_NEEDIRQ,d0
  1483.     move.w    #$000f,$dff096
  1484.     move.w    #0,$dff0a8
  1485.     move.w    #0,$dff0b8
  1486.     move.w    #0,$dff0c8
  1487.     move.w    #0,$dff0d8
  1488. SDMA_1    move.w    (sp)+,d0
  1489.     rts
  1490.  
  1491.  
  1492. ;**********************************************************************
  1493.  
  1494. @SD_Lock
  1495. _SD_Lock
  1496.  
  1497.     tst.w    NestLevel
  1498.     bne    SDL_1
  1499.     move.w    #$0400,$dff09a
  1500. SDL_1    addi.w    #1,NestLevel
  1501.     rts
  1502.  
  1503.  
  1504. ;**********************************************************************
  1505.  
  1506. @SD_Unlock
  1507. _SD_Unlock
  1508.  
  1509.     tst.w    NestLevel
  1510.     beq    SDU_1
  1511.     subi.w    #1,NestLevel
  1512.     tst.w    NestLevel
  1513.     bne    SDU_1
  1514.     move.w    #$8400,$dff09a
  1515. SDU_1    rts
  1516.  
  1517. ;**********************************************************************
  1518.  
  1519.     cnop    0,4
  1520.  
  1521. NOPInterrupt
  1522.  
  1523.     move.w    d1,-(sp)
  1524.     andi.w    #$0380,d1
  1525.     move.w    d1,$dff09c
  1526.     move.w    (sp)+,d1
  1527.     rts
  1528.     
  1529. ;**********************************************************************
  1530.  
  1531.     cnop    0,4
  1532.  
  1533.     ;d1    =    ActiveInt
  1534.  
  1535. _AudioInterrupt
  1536. AudioInterrupt
  1537.     
  1538.     movem.l    d0-d7/a0-a6,-(sp)
  1539.     move.l    #$dff000,a5
  1540.     andi.w    #$0400,d1
  1541.     move.w    d1,($9c.w,a5)
  1542.     move.b    $bfe001,d0
  1543.     ori.b    #$02,d0
  1544.     move.b    d0,$bfe001
  1545.     move.w    DriverFlags(pc),d7
  1546.     btst    #FLGB_PLAYING,d7
  1547.     beq.b    AI_1
  1548.     move.w    LastPeriod(pc),d1
  1549.     move.w    d1,($a6.w,a5)
  1550.     move.w    d1,($b6.w,a5)
  1551.     move.w    d1,($c6.w,a5)
  1552.     move.w    d1,($d6.w,a5)
  1553.     bra.b    AI_2
  1554. AI_1    ori.w    #FLGF_NEEDIRQ,d7
  1555. AI_2    move.l    PlayPos(pc),d4
  1556.     move.l    ProvidePos(pc),d5
  1557.     move.l    QueueBuffer(pc),a4
  1558. AI_3    cmp.l    d4,d5
  1559.     beq    AI_4
  1560.     move.l    a4,a0
  1561.     move.l    d4,d1
  1562.     mulu.l    #sia_SIZEOF,d1
  1563.     adda.l    d1,a0
  1564.     cmpi.l    #$ffffffff,sia_offset(a0)
  1565.     beq    AI_3a
  1566.     btst    #FLGB_FLUSH,d7
  1567.     beq    AI_4
  1568. AI_3a    addq.l    #1,d4
  1569.     divul.l    QUEUE_SIZE(pc),d1:d4
  1570.     move.l    d1,d4
  1571.     cmp.l    d4,d5
  1572.     beq    AI_3ba
  1573.     btst    #FLGB_FLUSH,d7
  1574.     beq    AI_3b
  1575. AI_3ba    bsr    StopDMA
  1576.     andi.w    #~(FLGF_FLUSH|FLGF_PLAYING),d7
  1577.     ori.w    #FLGF_NEEDIRQ,d7
  1578. AI_3b    movem.l    d0-d1/a0-a1/a5,-(sp)
  1579.  
  1580.     move.l    sia_callback(a0),a5
  1581.     bsr    AudioFunc
  1582.     
  1583.     move.l    a0,a5
  1584.     moveq    #sia_SIZEOF-1,d0
  1585. AB_3c    move.b    #0,(a5)+
  1586.     dbra    d0,AB_3c
  1587.     movem.l    (sp)+,d0-d1/a0-a1/a5
  1588.     bra    AI_3
  1589. AI_4    btst    #FLGB_FLUSH,d7
  1590.     beq    AI_5
  1591.     move.w    #1,CurrentBuffer
  1592.     clr.l    PlayPos
  1593.     moveq    #0,d5
  1594.     andi.w    #~(FLGF_FLUSH|FLGF_PLAYING),d7
  1595.     ori.w    #FLGF_NEEDIRQ,d7
  1596.     bra    AI_6
  1597. AI_5    move.l    d4,PlayPos
  1598. AI_5b    cmp.l    d4,d5
  1599.     beq    AI_7
  1600. AI_5a    move.l    a4,a0
  1601.     move.l    d4,d1
  1602.     mulu.l    #sia_SIZEOF,d1
  1603.     adda.l    d1,a0
  1604.     move.l    sia_offset(a0),d1
  1605.     cmp.l    sia_samples(a0),d1
  1606.     bcs    AI_7
  1607.     move.l    #$ffffffff,sia_offset(a0)
  1608.     addq.l    #1,d4
  1609.     divul.l    QUEUE_SIZE(pc),d1:d4
  1610.     move.l    d1,d4
  1611.     cmp.l    d4,d5
  1612.     bne    AI_5a
  1613.     ori.w    #FLGF_NEEDIRQ,d7
  1614. AI_7    btst    #FLGB_PAUSE,d7
  1615.     beq    AI_8
  1616.     bsr    StopDMA
  1617.     andi.w    #~(FLGF_PLAYING),d7
  1618.     ori.w    #FLGF_NEEDIRQ,d7
  1619.     bra    AI_6
  1620. AI_8    move.w    CurrentBuffer(pc),d1
  1621.     cmpi.w    #1,d1
  1622.     bne.b    AI_8a
  1623.     move.l    DMABuffer1(pc),a6
  1624.     bra.b    AI_8b
  1625. AI_8a    move.l    DMABuffer2(pc),a6
  1626. AI_8b    moveq    #0,d2
  1627.     moveq    #0,d6
  1628.     move.w    d7,-(sp)
  1629.     move.l    ConversionTable(pc),a3
  1630. AI_10    cmp.l    BUFFER_SIZE(pc),d2
  1631.     bcc    AI_9
  1632.     cmp.l    d4,d5
  1633.     beq    AI_9
  1634.     move.l    QueueBuffer(pc),a4
  1635.     move.l    d4,d1
  1636.     mulu.l    #sia_SIZEOF,d1
  1637.     adda.l    d1,a4
  1638.     move.l    sia_samples(a4),d3
  1639.     sub.l    sia_offset(a4),d3
  1640.     ble    AI_10a
  1641.     move.l    BUFFER_SIZE(pc),d0
  1642.     sub.l    d2,d0
  1643.     cmp.l    d0,d3
  1644.     ble    AI_10b
  1645.     move.l    d0,d3
  1646. AI_10b    tst.w    d6
  1647.     beq.b    AI_10c
  1648.     cmp.l    sia_period(a4),d6
  1649.     bne    AI_9
  1650.     bra.b    AI_10d
  1651. AI_10c    move.l    sia_period(a4),d6
  1652. AI_10d    move.l    sia_offset(a4),d7
  1653.     moveq    #0,d0
  1654.     move.w    sia_interleave(a4),d0
  1655.     addq.w    #1,d0
  1656.     mulu.l    d0,d7
  1657.     move.l    sia_left(a4),a0
  1658.     lsl.l    #1,d7
  1659.     adda.l    d7,a0
  1660.     move.l    a6,a1
  1661.     adda.l    d2,a1
  1662.     move.l    a1,a2
  1663.     adda.l    LEFT_LSB(pc),a2
  1664.     move.l    d3,d0
  1665.     move.w    sia_interleave(a4),d1
  1666.     move.l    ConversionTable(pc),a3
  1667.     bsr    ConvertStream
  1668.     move.l    sia_right(a4),a0
  1669.     adda.l    d7,a0
  1670.     move.l    a6,a1
  1671.     adda.l    d2,a1
  1672.     move.l    a1,a2
  1673.     adda.l    RIGHT_MSB(pc),a1
  1674.     adda.l    RIGHT_LSB(pc),a2
  1675.     move.l    d3,d0
  1676.     move.w    sia_interleave(a4),d1
  1677.     move.l    ConversionTable(pc),a3
  1678.     bsr    ConvertStream
  1679.     add.l    d3,sia_offset(a4)
  1680.     add.l    d3,d2
  1681. AI_10a    addq.l    #1,d4
  1682.     divul.l    QUEUE_SIZE(pc),d1:d4
  1683.     move.l    d1,d4
  1684.     bra    AI_10
  1685. AI_9    move.w    (sp)+,d7
  1686.     tst.l    d2
  1687.     beq    AI_6
  1688.     move.w    d6,LastPeriod
  1689.     move.l    a6,($a0.w,a5)
  1690.     adda.l    BUFFER_SIZE(pc),a6
  1691.     move.l    a6,($b0.w,a5)
  1692.     adda.l    BUFFER_SIZE(pc),a6
  1693.     move.l    a6,($c0.w,a5)
  1694.     adda.l    BUFFER_SIZE(pc),a6
  1695.     move.l    a6,($d0.w,a5)
  1696.     move.w    _VolumeR(pc),($a8.w,a5)
  1697.     move.w    _VolumeL(pc),($b8.w,a5)
  1698.     move.w    #1,($c8.w,a5)
  1699.     move.w    #1,($d8.w,a5)
  1700.     lsr.l    #1,d2
  1701.     move.w    d2,($a4.w,a5)
  1702.     move.w    d2,($b4.w,a5)
  1703.     move.w    d2,($c4.w,a5)
  1704.     move.w    d2,($d4.w,a5)
  1705.     btst    #FLGB_PLAYING,d7
  1706.     bne    AI_9a
  1707.     ori.w    #FLGF_PLAYING,d7
  1708.     move.w    d6,($a6.w,a5)
  1709.     move.w    d6,($b6.w,a5)
  1710.     move.w    d6,($c6.w,a5)
  1711.     move.w    d6,($d6.w,a5)
  1712.     move.w    #$800f,($96.w,a5)
  1713. AI_9a    addi.w    #1,CurrentBuffer
  1714.     cmpi.w    #3,CurrentBuffer
  1715.     bne    AI_6
  1716.     move.w    #1,CurrentBuffer
  1717. AI_6    move.w    d7,DriverFlags
  1718.     move.l    d5,ProvidePos
  1719.     movem.l    (sp)+,d0-d7/a0-a6
  1720.     rts
  1721.  
  1722. LastPeriod    dc.w    1
  1723. CurrentBuffer    dc.w    0
  1724.  
  1725. _audioMP    dc.l    0
  1726. _replyMP    dc.l    0
  1727.  
  1728. _VolumeL    dc.w    64
  1729. _VolumeR    dc.w    64
  1730.  
  1731.  
  1732. ;**********************************************************************
  1733.  
  1734.  
  1735. CreateTable:
  1736.  
  1737.     movem.l    a2/d2-d6,-(sp)
  1738.     lea    128(a1),a2
  1739.     move.l    a2,a1
  1740.     moveq    #128-1,d0
  1741.     moveq    #0,d5
  1742. CT_1    move.b    (a1)+,d1
  1743.     ext.w    d1
  1744.     ext.l    d1
  1745.     add.l    d1,d5
  1746.     dbra    d0,CT_1
  1747.     move.l    #32768,d6
  1748.     move.l    a2,a1
  1749.     move.w    #32768-1,d0
  1750.     moveq    #0,d1
  1751.     moveq    #0,d2
  1752.     moveq    #0,d3
  1753. CT_2    move.b    (a1)+,d4
  1754.     ext.w    d4
  1755.     add.w    d4,d3
  1756. CT_3    tst.w    d3
  1757.     bgt.s    CT_5
  1758. CT_4    addq.w    #1,d1
  1759.     sub.w    d4,d2
  1760.     bra.s    CT_2
  1761. CT_5    move.b    d1,(a0)+
  1762.     move.b    d2,(a0)+
  1763.     sub.l    d5,d6
  1764.     bpl.s    CT_6
  1765.     add.l    #32768,d6
  1766.     addq.w    #1,d2
  1767.     subq.w    #1,d3
  1768. CT_6    dbra    d0,CT_3
  1769.     move.l    a2,a1
  1770.     moveq    #128-1,d0
  1771.     moveq    #0,d5
  1772. CT_7    move.b    -(a1),d1
  1773.     ext.w    d1
  1774.     ext.l    d1
  1775.     add.l    d1,d5
  1776.     dbra    d0,CT_7
  1777.     move.l    #32768,d6
  1778.     add.l    #2*32768,a0
  1779.     move.l    a2,a1
  1780.     move.w    #32768-1,d0
  1781.     moveq    #-1,d1
  1782.     moveq    #-1,d2
  1783.     moveq    #0,d3
  1784. CT_8    move.b    -(a1),d4
  1785.     ext.w    d4
  1786.     add.w    d4,d3
  1787.     add.w    d4,d2
  1788. CT_9    tst.w    d3
  1789.     bgt.s    CT_11
  1790. CT_10    subq.w    #1,d1
  1791.     bra.s    CT_8
  1792. CT_11    move.b    d2,-(a0)
  1793.     move.b    d1,-(a0)
  1794.     sub.l    d5,d6
  1795.     bpl.s    CT_12
  1796.     add.l    #32768,d6
  1797.     subq.w    #1,d2
  1798.     subq.w    #1,d3
  1799. CT_12    dbra    d0,CT_9
  1800.     movem.l    (sp)+,a2/d2-d6
  1801.     rts
  1802.  
  1803. ;**********************************************************************
  1804.     
  1805. SwapEndian:
  1806.     
  1807.     movem.l    d0-d3/a0,-(sp)
  1808.     move.w    #65535,d0
  1809.     move.l    ConversionTable(pc),a0
  1810.     moveq    #0,d1
  1811. SE_1    move.l    d1,d2
  1812.     rol.w    #8,d2
  1813.     cmp.l    d1,d2
  1814.     bhs.s    SE_2
  1815.     move.w    (a0,d1.l*2),d3
  1816.     move.w    (a0,d2.l*2),(a0,d1.l*2)
  1817.     move.w    d3,(a0,d2.l*2)
  1818. SE_2    addq.l    #1,d1
  1819.     dbra    d0,SE_1
  1820.     movem.l    (sp)+,d0-d3/a0
  1821.     rts
  1822.  
  1823. ;**********************************************************************
  1824.     
  1825. ConvertStream
  1826.  
  1827.     movem.l    d2-d4/a2-a3,-(sp)
  1828.     addq.w    #1,d1
  1829.     add.w    d1,d1
  1830.     moveq    #0,d2
  1831.     move.w    d0,-(sp)
  1832.     lsr.l    #2,d0
  1833.     bra.s    CS_3
  1834. CS_1    swap    d0
  1835. CS_2    move.w    (a0),d2
  1836.     add.w    d1,a0
  1837.     move.w    (a3,d2.l*2),d3
  1838.     move.b    d3,d4
  1839.     rol.w    #8,d4
  1840.     move.w    (a0),d2
  1841.     add.w    d1,a0
  1842.     move.b    (a3,d2.l*2),d3
  1843.     swap    d3
  1844.     move.b    1(a3,d2.l*2),d4
  1845.     swap    d4
  1846.     move.w    (a0),d2
  1847.     add.w    d1,a0
  1848.     move.w    (a3,d2.l*2),d3
  1849.     move.b    d3,d4
  1850.     rol.w    #8,d4
  1851.     move.w    (a0),d2
  1852.     add.w    d1,a0
  1853.     move.b    (a3,d2.l*2),d3
  1854.     move.l    d3,(a1)+
  1855.     move.b    1(a3,d2.l*2),d4
  1856.     move.l    d4,(a2)+
  1857. CS_3    dbra    d0,CS_2
  1858.     swap    d0
  1859.     dbra    d0,CS_1
  1860.     move.w    (sp)+,d0
  1861.     andi.w    #$3,d0
  1862.     bra.s    CS_5
  1863. CS_4    move.w    (a0),d2
  1864.     add.w    d1,a0
  1865.     move.b    (a3,d2.l*2),(a1)+
  1866.     move.b    1(a3,d2.l*2),(a2)+
  1867. CS_5    dbra    d0,CS_4
  1868.     movem.l    (sp)+,d2-d4/a2-a3
  1869.     rts
  1870.  
  1871.  
  1872. ;**********************************************************************
  1873.  
  1874.     XDEF    _StartResource
  1875.     XDEF    @StartResource
  1876.     
  1877. _StartResource
  1878. @StartResource
  1879. StartResource:
  1880.  
  1881.     movem.l    d0-d1/a0-a1,-(sp)
  1882.     bsr    ActivateNewResource
  1883.     lea    intuition_name(pc),a1
  1884.     moveq    #0,d0
  1885.     moveq    #E_PLACE|E_FATALERROR,d1
  1886.     bsr    R_OpenLibrary
  1887.     move.l    d0,_IntuitionBase
  1888.     lea    dos_name(pc),a1
  1889.     moveq    #0,d0
  1890.     moveq    #E_PLACE|E_FATALERROR,d1
  1891.     bsr    R_OpenLibrary
  1892.     move.l    d0,_DOSBase
  1893.     lea    graphics_name(pc),a1
  1894.     moveq    #0,d0
  1895.     moveq    #E_PLACE|E_FATALERROR,d1
  1896.     bsr    R_OpenLibrary
  1897.     move.l    d0,_GfxBase
  1898.     movem.l    (sp)+,d0-d1/a0-a1
  1899.     rts
  1900.     
  1901. graphics_name    dc.b    'graphics.library',0
  1902. intuition_name    dc.b    'intuition.library',0
  1903. dos_name    dc.b    'dos.library',0
  1904.  
  1905. ;**********************************************************************
  1906.  
  1907.     ;Global Variables
  1908.  
  1909.     cnop    0,4
  1910.  
  1911. _IntuitionBase    dc.l    0
  1912. _DOSBase    dc.l    0
  1913. _GfxBase    dc.l    0
  1914. originalStack    dc.l    0
  1915.     
  1916. mainList    dc.l    0
  1917. resList        dc.l    0
  1918. resNext        dc.l    0
  1919.  
  1920.  
  1921. ;**********************************************************************
  1922.  
  1923.     cnop    0,4
  1924.     
  1925.     XDEF    _OpenFile
  1926.     XDEF    @OpenFile
  1927.     
  1928. _OpenFile
  1929. @OpenFile
  1930. OpenFile:
  1931.  
  1932.     ;d1    =    fileName
  1933.     ;d2    =    accessMode
  1934.     ;d3    =    flags
  1935.     
  1936.     movem.l    d4-d5/a0-a1/a6,-(sp)
  1937.     move.l    d1,d4
  1938.     move.l    d2,d5
  1939.     move.l    _DOSBase(pc),a6
  1940. OF_3    jsr    _LVOOpen(a6)
  1941.     move.l    d0,d2
  1942.     bne    OF_1
  1943.     lea    OF_err1(pc),a0
  1944.     lea    textArea,a1
  1945.     bsr    StrCpy
  1946.     move.l    d4,a0
  1947.     bsr    StrCpy
  1948.     lea    OF_err2(pc),a0
  1949.     bsr    StrCpy
  1950.     lea    textArea,a0
  1951.     bsr    ProduceError
  1952.     tst.w    d0
  1953.     beq    OF_2
  1954.     move.l    d4,d1
  1955.     move.l    d5,d2
  1956.     bra    OF_3
  1957. OF_1    andi.b    #E_PLACE,d3
  1958.     beq    OF_2
  1959.     moveq    #R_FILE,d0
  1960.     moveq    #rl_SIZEOF,d1
  1961.     bsr    Res_PlaceList
  1962. OF_2    move.l    d2,d0
  1963.     movem.l    (sp)+,d4-d5/a0-a1/a6
  1964.     rts
  1965.  
  1966.  
  1967. OF_err1        dc.b    'Could not open file "',0
  1968. OF_err2        dc.b    '".',0
  1969.  
  1970. ;**********************************************************************
  1971.  
  1972.     cnop    0,4
  1973.  
  1974.     ;d0=memSize
  1975.     ;d1=memType
  1976.     ;d2.w=memFlags
  1977.     
  1978.     ;return = d0
  1979.     
  1980.     ;scrap registers d0,d1
  1981.  
  1982.     XDEF    _GetMem
  1983.     XDEF    @GetMem
  1984.     
  1985. _GetMem
  1986. @GetMem
  1987. GetMem:
  1988.  
  1989.     movem.l    d2/d5-d6/a0-a1/a6,-(sp)
  1990.     move.l    d0,d5
  1991.     move.l    d1,d6
  1992.     move.l    4.w,a6
  1993. GM_1    jsr    _LVOAllocMem(a6)
  1994.     exg    d0,d2
  1995.     tst.l    d2
  1996.     bne.b    GM_2
  1997.     move.w    d0,d2
  1998.     lea    GM_errorMsg(pc),a0
  1999.     bsr    ProduceError
  2000.     tst.w    d0
  2001.     beq    GM_3
  2002.     move.l    d5,d0
  2003.     move.l    d6,d1
  2004.     bra.b    GM_1
  2005. GM_2    andi.b    #E_PLACE,d0
  2006.     beq.b    GM_3
  2007.     moveq    #R_MEMORY,d0
  2008.     moveq    #rmr_SIZEOF,d1
  2009.     bsr    Res_PlaceList
  2010.     move.l    d5,rm_memSize(a0)
  2011. GM_3    move.l    d2,d0
  2012.     movem.l    (sp)+,d2/d5-d6/a0-a1/a6
  2013.     rts
  2014.     
  2015. GM_errorMsg    dc.b    'Could not allocate enough memory.',0
  2016.  
  2017. ;**********************************************************************
  2018.  
  2019.     ;a1    =    libName
  2020.     ;d0    =    version No.
  2021.     ;d1.w    =    Flags
  2022.     ;return    =    d0
  2023.     
  2024.     XDEF    _R_OpenLibrary
  2025.     XDEF    @R_OpenLibrary
  2026.     
  2027. _R_OpenLibrary
  2028. @R_OpenLibrary
  2029. R_OpenLibrary:
  2030.  
  2031.     movem.l    d2-d5/a0/a6,-(sp)
  2032.     move.l    d0,d3
  2033.     move.w    d1,d5
  2034.     move.l    a1,d4
  2035.     move.l    4.w,a6
  2036. R_OP1a    jsr    _LVOOpenLibrary(a6)
  2037.     move.l    d0,d2
  2038.     bne    R_OP1
  2039.     lea    R_OP_msg1(pc),a0
  2040.     lea    textArea,a1
  2041.     bsr    StrCpy
  2042.     move.l    d4,a0
  2043.     bsr    StrCpy
  2044.     lea    R_OP_msg2(pc),a0
  2045.     bsr    StrCpy
  2046.     move.l    d3,d0
  2047.     bsr    itoa
  2048.     lea    R_OP_msg3(pc),a0
  2049.     bsr    StrCpy
  2050.     clr.b    (a1)
  2051.     lea    textArea,a0
  2052.     move.w    d5,d0
  2053.     bsr    ProduceError
  2054.     tst.w    d0
  2055.     beq    R_OP2
  2056.     move.l    d3,d0
  2057.     move.l    d4,a1
  2058.     bra    R_OP1a
  2059. R_OP1    andi.w    #E_PLACE,d5
  2060.     beq    R_OP2
  2061.     moveq    #R_LIBRARY,d0
  2062.     moveq    #rl_SIZEOF,d1
  2063.     bsr    Res_PlaceList
  2064. R_OP2    move.l    d2,d0
  2065.     movem.l    (sp)+,a0/d2-d5/a6
  2066.     rts
  2067.  
  2068. R_OP_msg1    dc.b    'Could not open library "',0
  2069. R_OP_msg2    dc.b    '" V',0
  2070. R_OP_msg3    dc.b    '.',0
  2071.  
  2072. ;**********************************************************************
  2073.     
  2074.     cnop    0,4
  2075.     
  2076.     ;d0    =    msgFlags
  2077.     ;return =    d0
  2078.     
  2079.     XDEF    _R_NewMsgPort
  2080.     XDEF    @R_NewMsgPort
  2081.         
  2082. _R_NewMsgPort
  2083. @R_NewMsgPort
  2084. R_NewMsgPort:
  2085.  
  2086.     movem.l    d1-d3/a0-a1/a6,-(sp)
  2087.     move.w    d0,d3
  2088.     move.l    4.w,a6
  2089. R_NMP3    jsr    _LVOCreateMsgPort(a6)
  2090.     move.l    d0,d2
  2091.     bne    R_NMP1
  2092.     lea    R_NMP_errorMsg(pc),a0
  2093.     move.l    d3,d0
  2094.     bsr    ProduceError
  2095.     tst.l    d0
  2096.     beq    R_NMP2
  2097.     bra    R_NMP3
  2098. R_NMP1    andi.b    #E_PLACE,d3
  2099.     beq    R_NMP2
  2100.     moveq    #R_MSGPORT,d0
  2101.     moveq    #rl_SIZEOF,d1
  2102.     bsr    Res_PlaceList
  2103. R_NMP2    move.l    d2,d0
  2104.     movem.l    (sp)+,d1-d3/a0-a1/a6
  2105.     rts
  2106.  
  2107. R_NMP_errorMsg    dc.b    'Could not allocate message port.',0
  2108.  
  2109. ;**********************************************************************
  2110.  
  2111.     cnop    0,4
  2112.     
  2113.     ;a0    =    MsgPort
  2114.     ;d0    =    size
  2115.     ;d1    =    ioFlags
  2116.     ;return    =    d0
  2117.     
  2118.     XDEF    _R_NewIORequest
  2119.     XDEF    @R_NewIORequest
  2120.     
  2121. _R_NewIORequest
  2122. @R_NewIORequest
  2123. R_NewIORequest:
  2124.  
  2125.     movem.l    d2-d4/a1-a2/a6,-(sp)
  2126.     move.l    a0,a2
  2127.     move.l    d0,d3
  2128.     move.w    d1,d4
  2129.     move.l    4.w,a6
  2130. R_NIO1    jsr    _LVOCreateIORequest(a6)
  2131.     move.l    d0,d2
  2132.     bne    R_NIO2
  2133.     lea    R_NIO_errorMsg(pc),a0
  2134.     move.l    d4,d0
  2135.     bsr    ProduceError
  2136.     tst.l    d0
  2137.     beq    R_NIO3
  2138.     move.l    a2,a0
  2139.     move.l    d3,d0
  2140.     bra    R_NIO1
  2141. R_NIO2    andi.b    #E_PLACE,d4
  2142.     beq    R_NIO3
  2143.     moveq    #R_IOREQUEST,d0
  2144.     moveq    #rl_SIZEOF,d1
  2145.     bsr    Res_PlaceList
  2146. R_NIO3    move.l    d2,d0
  2147.     movem.l    (sp)+,d2-d4/a1-a2/a6
  2148.     rts
  2149.     
  2150. R_NIO_errorMsg    dc.b    'Could not create IO port',0
  2151.     
  2152.  
  2153. ;**********************************************************************
  2154.     
  2155.     ;a0    =    device name
  2156.     ;d0    =    device unit
  2157.     ;a1    =    ioRequest
  2158.     ;a2    =    devF
  2159.     ;d1    =    device flags
  2160.     ;d2    =    flags
  2161.  
  2162.     cnop    0,4
  2163.  
  2164.     XDEF    _OpenDeviceRes
  2165.     XDEF    @OpenDeviceRes
  2166.     
  2167. _OpenDeviceRes
  2168. @OpenDeviceRes
  2169. OpenDeviceRes:
  2170.  
  2171.     movem.l    d3-d5/a3-a4/a6,-(sp)
  2172.     move.l    a0,a4
  2173.     move.l    a1,a3
  2174.     move.l    d0,d3
  2175.     move.l    d1,d4
  2176.     move.l    4.w,a6
  2177. ODR_1    jsr    _LVOOpenDevice(a6)
  2178.     move.l    d0,d5
  2179.     beq    ODR_2
  2180.     lea    textArea,a1
  2181.     lea    ODR_msg1(pc),a0
  2182.     bsr    StrCpy
  2183.     move.l    a4,a0
  2184.     bsr    StrCpy
  2185.     lea    ODR_msg2(pc),a0
  2186.     bsr    StrCpy
  2187.     move.l    d3,d0
  2188.     bsr    itoa
  2189.     lea    ODR_msg3(pc),a0
  2190.     bsr    StrCpy
  2191.     clr.b    (a1)
  2192.     lea    textArea,a0
  2193.     move.l    d2,d0
  2194.     bsr    ProduceError
  2195.     tst.l    d0
  2196.     beq    ODR_3
  2197.     move.l    a4,a0
  2198.     move.l    a3,a1
  2199.     move.l    d3,d0
  2200.     move.l    d4,d1
  2201.     bra    ODR_1
  2202. ODR_2    andi.b    #E_PLACE,d2
  2203.     beq    ODR_3
  2204.     moveq    #R_DEVICE,d0
  2205.     moveq    #rd_SIZEOF,d1
  2206.     move.l    a3,d2
  2207.     bsr    Res_PlaceList
  2208.     move.l    a2,rd_checkFlag(a0)
  2209. ODR_3    move.l    d5,d0
  2210.     movem.l    (sp)+,d3-d5/a3-a4/a6
  2211.     rts
  2212.  
  2213. ODR_msg1    dc.b    'Could not open "',0
  2214. ODR_msg2    dc.b    '" unit-',0
  2215. ODR_msg3    dc.b    '.',0
  2216.     
  2217. ;**********************************************************************
  2218.  
  2219.     cnop    0,4
  2220.     
  2221.     ;d0    =    signalNum
  2222.     ;d1    =    flags
  2223.     ;return    =    d0
  2224.     
  2225.     XDEF    _NewSignal
  2226.     XDEF    @NewSignal
  2227.     
  2228. _NewSignal
  2229. @NewSignal
  2230. NewSignal:
  2231.  
  2232.     movem.l    d2-d4/a0-a1/a6,-(sp)
  2233.     move.w    d0,d3
  2234.     move.w    d1,d4
  2235.     move.l    4.w,a6
  2236. NS_1    jsr    _LVOAllocSignal(a6)
  2237.     move.l    d0,d2
  2238.     tst.b    d0
  2239.     bpl    NS_2
  2240.     lea    NS_errorMsg(pc),a0
  2241.     move.l    d4,d0
  2242.     bsr    ProduceError
  2243.     tst.w    d0
  2244.     beq    NS_3
  2245.     move.w    d3,d0
  2246.     bra    NS_1
  2247. NS_2    andi.b    #E_PLACE,d4
  2248.     beq    NS_3
  2249.     moveq    #R_SIGNAL,d0
  2250.     moveq    #rl_SIZEOF,d1
  2251.     bsr    Res_PlaceList
  2252. NS_3    move.l    d2,d0
  2253.     movem.l    (sp)+,d2-d4/a0-a1/a6
  2254.     rts
  2255.     
  2256. NS_errorMsg    dc.b    'Could not allocate signal bit',0
  2257.  
  2258. ;**********************************************************************
  2259.  
  2260.     cnop    0,4
  2261.  
  2262.     ;d0    =    byteSize
  2263.     ;d1    =    attributes
  2264.     ;d2    =    flag
  2265.     ;return    =    d0
  2266.     
  2267.     XDEF    _GetVec
  2268.     XDEF    @GetVec
  2269.     
  2270. _GetVec
  2271. @GetVec
  2272. GetVec:
  2273.  
  2274.     movem.l    d3-d5/a0-a1/a6,-(sp)
  2275.     move.l    d0,d3
  2276.     move.l    d1,d4
  2277.     move.w    d2,d5
  2278.     move.l    4.w,a6
  2279. GV_1    jsr    _LVOAllocVec(a6)
  2280.     move.l    d0,d2
  2281.     bne    GV_2
  2282.     lea    GV_errorMsg(pc),a0
  2283.     move.l    d5,d0
  2284.     bsr    ProduceError
  2285.     tst.w    d0
  2286.     beq    GV_3
  2287.     move.l    d3,d0
  2288.     move.l    d4,d1
  2289.     bra    GV_1
  2290. GV_2    andi.w    #E_PLACE,d5
  2291.     beq    GV_3
  2292.     moveq    #R_VEC,d0
  2293.     moveq    #rl_SIZEOF,d1
  2294.     bsr    Res_PlaceList
  2295. GV_3    move.l    d2,d0
  2296.     movem.l    (sp)+,d3-d5/a0-a1/a6
  2297.     rts
  2298.  
  2299. GV_errorMsg    dc.b    'Not enough memory aviable.',0
  2300.     
  2301. ;**********************************************************************
  2302.  
  2303.  
  2304.     cnop    0,4
  2305.         
  2306.     ;a0    =    source
  2307.     ;a1    =    destination
  2308.     
  2309. StrCpy:
  2310.     move.b    (a0)+,d0
  2311.     beq    ST_E
  2312.     move.b    d0,(a1)+
  2313.     bra    StrCpy
  2314. ST_E    rts
  2315.  
  2316. ;**********************************************************************
  2317.  
  2318.     ;d0.l    =    number
  2319.     ;a1    =    string buffer
  2320.     
  2321. itoa:    movem.l    d1-d2/a0,-(sp)
  2322.     lea    textAreaB,a0
  2323.     tst.l    d0
  2324.     bpl    itoa_1a
  2325.     move.b    #'-',(a1)+
  2326. itoa_1a    moveq    #0,d2
  2327. itoa_1    divul.l    #10,d1:d0
  2328.     addi.b    #$30,d1
  2329.     move.b    d1,(a0)+
  2330.     addq.w    #1,d2
  2331.     tst.l    d0
  2332.     bne    itoa_1
  2333.     subq.w    #1,d2
  2334. itoa_2    move.b    -(a0),(a1)+
  2335.     dbra    d2,itoa_2
  2336.     movem.l    (sp)+,d1-d2/a0
  2337.     rts
  2338.  
  2339. ;**********************************************************************
  2340.  
  2341.     ;d0    =    type
  2342.     ;d1    =    sizeof
  2343.     ;d2.l    =    item
  2344.     ;return    =    a0
  2345.  
  2346.     ;scrap d0,d1
  2347.  
  2348.     XDEF    _Res_PlaceList
  2349.     XDEF    @Res_PlaceList
  2350.     
  2351. _Res_PlaceList
  2352. @Res_PlaceList    
  2353. Res_PlaceList:
  2354.  
  2355.     movem.l    d3-d4/a1,-(sp)
  2356.     move.w    d0,d3
  2357.     move.l    d2,d4
  2358.     move.l    d1,d0
  2359.     moveq    #1,d1
  2360.     move.w    #E_RETRYERROR,d2
  2361.     bsr    GetMem
  2362.     move.l    d0,a0
  2363.     tst.l    d0
  2364.     beq.w    RPL_1
  2365.     tst.l    resList(pc)
  2366.     bne    RPL_1a
  2367.     move.l    d0,resList
  2368.     clr.l    rl_prev(a0)
  2369.     bra.w    RPL_3
  2370. RPL_1a    move.l    resNext(pc),a1
  2371.     move.l    d0,rl_next(a1)
  2372.     move.l    a1,rl_prev(a0)
  2373. RPL_3    move.l    a0,resNext
  2374.     clr.l    rl_next(a0)
  2375.     move.w    d3,rl_type(a0)
  2376.     move.l    d4,rl_item(a0)
  2377.     bra.b    RPL_4
  2378. RPL_1    lea    RPL_errorMsg(pc),a0
  2379.     bsr    FatalError
  2380. RPL_4    move.l    d4,d2
  2381.     movem.l    (sp)+,a1/d3-d4
  2382.     rts
  2383.  
  2384. RPL_errorMsg    dc.b    'Not enough memory available.',0
  2385.  
  2386. ;**********************************************************************
  2387.  
  2388.     cnop    0,4
  2389.     
  2390.     XDEF    _ActivateNewResource
  2391.     XDEF    @ActivateNewResource
  2392.     
  2393. _ActivateNewResource
  2394. @ActivateNewResource
  2395. ActivateNewResource:
  2396.  
  2397.     bsr    AllocResource
  2398.     bsr    ActivateResource
  2399.     rts
  2400.  
  2401. ;**********************************************************************
  2402.  
  2403.     XDEF    _AllocResource
  2404.     XDEF    @AllocResource
  2405.     
  2406. _AllocResource
  2407. @AllocResource
  2408. AllocResource:
  2409.  
  2410.     movem.l    d1-d2/a0-a1,-(sp)
  2411.     moveq    #rma_SIZEOF,d0
  2412.     move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  2413.     moveq    #E_FATALERROR,d2
  2414.     bsr    GetMem
  2415.     move.l    d0,a1
  2416.     moveq    #rma_SIZEOF,d0
  2417.     move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  2418.     moveq    #E_FATALERROR,d2
  2419.     bsr    GetMem
  2420.     move.l    mainList(pc),a0
  2421.     tst.l    a0
  2422.     beq    AR_1
  2423. AR_1a    move.l    rma_next(a0),d1
  2424.     beq    AR_1b
  2425.     move.l    d1,a0
  2426.     bra    AR_1a
  2427. AR_1b    move.l    a0,rma_prev(a1)
  2428.     move.l    a1,rma_next(a0)
  2429.     bra    AR_2
  2430. AR_1    move.l    a1,mainList
  2431. AR_2    move.l    d0,rma_resList(a1)
  2432.     move.l    d0,a0
  2433.     move.w    #R_BLANK,rl_type(a0)
  2434.     movem.l    (sp)+,d1-d2/a0-a1
  2435.     rts
  2436.  
  2437. ;**********************************************************************
  2438.  
  2439.     ;d0    =    oldList
  2440.  
  2441.     XDEF    _RemoveResource
  2442.     XDEF    @RemoveResource
  2443.     
  2444. _RemoveResource
  2445. @RemoveResource
  2446. RemoveResource:
  2447.  
  2448.     movem.l    d1-d3/a0-a2/a6,-(sp)
  2449.     move.l    mainList(pc),a2
  2450.     tst.l    a2
  2451.     beq    RR_E
  2452. RR_1    cmp.l    rma_resList(a2),d0
  2453.     bne    RR_3
  2454.     move.l    resList(pc),d2
  2455.     move.l    resNext(pc),d3
  2456.     bsr    ActivateResource
  2457.     bsr    Res_FreeResource
  2458.     move.l    rma_prev(a2),a0
  2459.     move.l    rma_next(a2),a1
  2460.     tst.l    a1
  2461.     beq    RR_4
  2462.     move.l    a0,rma_prev(a1)
  2463. RR_4    tst.l    a0
  2464.     beq    RR_5
  2465.     move.l    a1,rma_next(a0)
  2466. RR_5    move.l    4.w,a6
  2467.     move.l    a2,a1
  2468.     moveq    #rma_SIZEOF,d0
  2469.     jsr    _LVOFreeMem(a6)
  2470.     move.l    d2,resList
  2471.     move.l    d3,resNext
  2472.     bra    RR_E
  2473. RR_3    move.l    rma_next(a2),a2
  2474.     tst.l    a2
  2475.     bne    RR_1
  2476. RR_E    movem.l    (sp)+,d1-d3/a0-a2/a6
  2477.     rts
  2478.  
  2479. ;**********************************************************************
  2480.  
  2481.     ;d0    =    actList
  2482.     
  2483.     XDEF    _ActivateResource
  2484.     XDEF    @ActivateResource
  2485.     
  2486. _ActivateResource
  2487. @ActivateResource
  2488. ActivateResource:
  2489.  
  2490.     movem.l    d0/a0,-(sp)
  2491.     move.l    mainList(pc),a0
  2492.     tst.l    a0
  2493.     beq    ARe_E
  2494. ARe_1    cmp.l    rma_resList(a0),d0
  2495.     bne    ARe_2
  2496.     move.l    rma_resList(a0),a0
  2497.     move.l    a0,resList
  2498. ARe_4    move.l    rl_next(a0),d0
  2499.     beq    ARe_3
  2500.     move.l    d0,a0
  2501.     bra    ARe_4
  2502. ARe_3    move.l    a0,resNext
  2503.     bra    ARe_E
  2504. ARe_2    move.l    rma_next(a0),a0
  2505.     tst.l    a0
  2506.     bne    ARe_1
  2507. ARe_E    movem.l    (sp)+,d0/a0
  2508.     rts
  2509.  
  2510. ;**********************************************************************
  2511.  
  2512.     XDEF    _FreeAll
  2513.     XDEF    @FreeAll
  2514.     
  2515. _FreeAll
  2516. @FreeAll
  2517. FreeAll:
  2518.  
  2519.     movem.l    d0-d1/a0-a2/a6,-(sp)
  2520.     move.l    4.w,a6
  2521.     move.l    mainList(pc),a2
  2522.     tst.l    a2
  2523.     beq    FA_E
  2524. FA_1    move.l    rma_next(a2),d0
  2525.     beq    FA_2
  2526.     move.l    d0,a2
  2527.     bra    FA_1
  2528. FA_2    move.l    rma_resList(a2),d0
  2529.     bsr    ActivateResource
  2530.     bsr    Res_FreeResource
  2531.     move.l    a2,a1
  2532.     move.l    rma_prev(a1),a2
  2533.     moveq    #rma_SIZEOF,d0
  2534.     jsr    _LVOFreeMem(a6)
  2535.     tst.l    a2
  2536.     bne    FA_2
  2537. FA_E    movem.l    (sp)+,d0-d1/a0-a2/a6
  2538.     rts
  2539.  
  2540. ;**********************************************************************
  2541.  
  2542.     XDEF    _Res_FreeResource
  2543.     XDEF    @Res_FreeResource
  2544.     
  2545. _Res_FreeResource
  2546. @Res_FreeResource
  2547. Res_FreeResource:
  2548.  
  2549.     movem.l    d0-d1/a0-a3/a6,-(sp)
  2550.     move.l    resNext(pc),a2
  2551.     lea    R_jmpTab(pc),a3
  2552. R_1    tst.l    a2
  2553.     beq    R_E
  2554.     move.l    4.w,a6
  2555.     move.w    rl_type(a2),d0
  2556.     move.l    (d0.w*4,a3),d0
  2557. R_jmp    jmp    (pc,d0.l)
  2558. R_mem    move.l    rl_item(a2),a1
  2559.     move.l    rm_memSize(a2),d0
  2560.     jsr    _LVOFreeMem(a6)
  2561.     moveq    #rmr_SIZEOF,d0
  2562.     bra    R_2
  2563. R_scr    move.l    _IntuitionBase(pc),a6
  2564.     move.l    rl_item(a2),a0
  2565.     jsr    _LVOCloseScreen(a6)
  2566.     moveq    #rl_SIZEOF,d0
  2567.     bra    R_2
  2568. R_lib    move.l    rl_item(a2),a1
  2569.     jsr    _LVOCloseLibrary(a6)
  2570.     moveq    #rl_SIZEOF,d0
  2571.     bra    R_2
  2572. R_bla    moveq    #rl_SIZEOF,d0
  2573.     bra    R_2
  2574. R_msg    move.l    rl_item(a2),a0
  2575.     jsr    _LVODeleteMsgPort(a6)
  2576.     moveq    #rl_SIZEOF,d0
  2577.     bra    R_2
  2578. R_ior    move.l    rl_item(a2),a0
  2579.     jsr    _LVODeleteIORequest(a6)
  2580.     moveq    #rl_SIZEOF,d0
  2581.     bra    R_2
  2582. R_dev    move.l    rd_checkFlag(a2),a1
  2583.     tst.b    (a1)
  2584.     beq    R_dev1
  2585.     move.l    rl_item(a2),a1
  2586.     jsr    _LVOCheckIO(a6)
  2587.     tst.l    d0
  2588.     bne    R_dev1
  2589.     move.l    rl_item(a2),a1
  2590.     jsr    _LVOAbortIO(a6)
  2591.     move.l    rl_item(a2),a1
  2592.     jsr    _LVOWaitIO(a6)
  2593. R_dev1    move.l    rl_item(a2),a1
  2594.     jsr    _LVOCloseDevice(a6)
  2595.     moveq    #rd_SIZEOF,d0
  2596.     bra    R_2
  2597. R_fun    move.l    rl_item(a2),a1
  2598.     jsr    (a1)
  2599.     moveq    #rl_SIZEOF,d0
  2600.     bra    R_2
  2601. R_vec    move.l    rl_item(a2),a1
  2602.     jsr    _LVOFreeVec(a6)
  2603.     moveq    #rl_SIZEOF,d0
  2604.     bra    R_2
  2605. R_sig    move.l    rl_item(a2),d0
  2606.     jsr    _LVOFreeSignal(a6)
  2607.     moveq    #rl_SIZEOF,d0
  2608.     bra    R_2
  2609.     
  2610. R_clo    move.l    rl_item(a2),d1
  2611.     move.l    _DOSBase(pc),a6
  2612.     jsr    _LVOClose(a6)
  2613.     moveq    #rl_SIZEOF,d0
  2614.     bra    R_2
  2615.     
  2616. R_2    move.l    a2,a1
  2617.     move.l    rl_prev(a1),a2
  2618.     move.l    4.w,a6
  2619.     jsr    _LVOFreeMem(a6)
  2620.     bra    R_1
  2621. R_E    movem.l    (sp)+,d0-d1/a0-a3/a6
  2622.     rts
  2623.  
  2624. R_jmpTab    dc.l    R_mem-R_jmp-2
  2625.         dc.l    R_scr-R_jmp-2
  2626.         dc.l    R_lib-R_jmp-2
  2627.         dc.l    R_bla-R_jmp-2
  2628.         dc.l    R_msg-R_jmp-2
  2629.         dc.l    R_ior-R_jmp-2
  2630.         dc.l    R_dev-R_jmp-2
  2631.         dc.l    R_fun-R_jmp-2
  2632.         dc.l    R_vec-R_jmp-2
  2633.         dc.l    R_sig-R_jmp-2
  2634.         dc.l    R_clo-R_jmp-2
  2635.  
  2636. ;**********************************************************************
  2637.     
  2638.     cnop    0,4
  2639.     
  2640.     ;d0    =    errorFlags
  2641.     ;a0    =    errorMsg Ptr.
  2642.     ;d0    =    return( 0=DON'T TRY AGAIN , 1=TRY AGAIN )
  2643.  
  2644.     XDEF    _ProduceError
  2645.     XDEF    @ProduceError
  2646.     
  2647. _ProduceError
  2648. @ProduceError
  2649. ProduceError:
  2650.  
  2651.     move.l    d1,-(sp)
  2652.     move.w    d0,d1
  2653.     andi.b    #E_NOTIFYERROR,d1
  2654.     beq    PE_1
  2655.     bsr    NotifyError
  2656.     moveq    #0,d0
  2657.     bra    PE_E
  2658. PE_1    move.w    d0,d1
  2659.     andi.b    #E_RETRYERROR,d1
  2660.     beq    PE_2
  2661.     bsr    RetryError
  2662.     bra    PE_E
  2663. PE_2    andi.b    #E_FATALERROR,d0
  2664.     beq    PE_3
  2665.     bsr    FatalError
  2666. PE_3    moveq    #0,d0
  2667. PE_E    move.l    (sp)+,d1
  2668.     rts
  2669.     
  2670. ;**********************************************************************
  2671.  
  2672.     ;a0    =    errorMsg
  2673.     ;return    =    d0
  2674.  
  2675.     XDEF    _RetryError
  2676.     XDEF    @RetryError
  2677.  
  2678. _RetryError
  2679. @RetryError
  2680. RetryError:
  2681.  
  2682.     movem.l    d1/a1-a3/a6,-(sp)
  2683.     move.l    _IntuitionBase(pc),a6
  2684.     tst.l    a6
  2685.     beq    RE_E
  2686.     lea    RE_easy(pc),a1
  2687.     move.l    a0,12(a1)
  2688.     suba.l    a0,a0
  2689.     suba.l    a2,a2
  2690.     suba.l    a3,a3
  2691.     jsr    _LVOEasyRequestArgs(a6)
  2692. RE_E    movem.l    (sp)+,d1/a1-a3/a6
  2693.     rts
  2694.     
  2695. RE_easy        dc.l    20,0,RE_title,0,RE_msg
  2696. RE_title    dc.b    'Error',0
  2697. RE_msg        dc.b    'Retry|Cancel',0
  2698.     
  2699.  
  2700. ;**********************************************************************
  2701.  
  2702.     cnop    0,4
  2703.     
  2704.     XDEF    _NotifyError
  2705.     XDEF    @NotifyError
  2706.     
  2707. _NotifyError
  2708. @NotifyError
  2709. NotifyError:
  2710.  
  2711.     movem.l    d1/a1-a3/a6,-(sp)
  2712.     move.l    _IntuitionBase(pc),a6
  2713.     tst.l    a6
  2714.     beq    NE_E
  2715.     lea    NE_easy(pc),a1
  2716.     move.l    a0,12(a1)
  2717.     suba.l    a0,a0
  2718.     suba.l    a2,a2
  2719.     suba.l    a3,a3
  2720.     jsr    _LVOEasyRequestArgs(a6)
  2721. NE_E    movem.l    (sp)+,d1/a1-a3/a6
  2722.     rts
  2723.  
  2724. NE_easy        dc.l    20,0,NE_title,0,NE_msg
  2725. NE_title    dc.b    'Message',0
  2726. NE_msg        dc.b    'OK',0
  2727.  
  2728.  
  2729. ;**********************************************************************
  2730.     
  2731.     cnop    0,4
  2732.     
  2733.     XDEF    _FatalError
  2734.     XDEF    @FatalError
  2735.     
  2736. _FatalError
  2737. @FatalError
  2738. FatalError:
  2739.  
  2740.     movem.l    d0-d1/a1-a3/a6,-(sp)
  2741.     move.l    _IntuitionBase(pc),a6
  2742.     tst.l    a6
  2743.     beq    FE_1
  2744.     lea    FE_easy(pc),a1
  2745.     move.l    a0,12(a1)
  2746.     suba.l    a0,a0
  2747.     suba.l    a2,a2
  2748.     suba.l    a3,a3
  2749.     jsr    _LVOEasyRequestArgs(a6)
  2750.     bsr    FreeAll
  2751. FE_1    move.l    originalStack(pc),d0
  2752.     beq    FE_2
  2753.     move.l    d0,sp
  2754.     rts
  2755. FE_2    lea    FE_dosname(pc),a1
  2756.     moveq    #0,d0
  2757.     moveq    #E_RETRYERROR,d1
  2758.     bsr    R_OpenLibrary
  2759.     tst.l    d0
  2760.     beq    FE_3
  2761.     move.l    d0,a6
  2762.     moveq    #-1,d0
  2763.     jsr    _LVOExit(a6)
  2764. FE_3    movem.l    (sp)+,d0-d1/a1-a3/a6
  2765.     rts
  2766.     
  2767.  
  2768. FE_easy        dc.l    20,0,FE_title,0,FE_msg
  2769. FE_title    dc.b    'Fatal Error',0
  2770. FE_msg        dc.b    'OK',0
  2771. FE_dosname    dc.b    'dos.library',0
  2772.  
  2773. ;**********************************************************************
  2774.  
  2775.     cnop    0,4
  2776.  
  2777. _DoSCSI
  2778. @DoSCSI    
  2779. DoSCSI
  2780.  
  2781.     ;a0    =    IORequest
  2782.     ;a1    =    Command
  2783.     ;d0    =    CommandLength
  2784.     ;a2    =    Buffer
  2785.     ;d1    =    Length
  2786.     ;d2    =    Flags
  2787.     ;d3    =    Asynchronous
  2788.     ;a3    =    ActivityName
  2789.     
  2790. DS_1    movem.l    d0-d7/a0-a6,-(sp)
  2791.     move.l    40(a0),a4
  2792.     move.l    a2,(a4)
  2793.     move.l    d1,4(a4)
  2794.     clr.l    8(a4)
  2795.     move.l    a1,12(a4)
  2796.     move.w    d0,16(a4)
  2797.     clr.w    18(a4)
  2798.     tst.l    22(a4)
  2799.     beq    DS_2
  2800.     ori.b    #$02,d2
  2801. DS_2    move.b    d2,20(a4)
  2802.     clr.b    21(a4)
  2803.     clr.w    28(a4)
  2804.     clr.b    30(a0)
  2805.     move.l    #30,36(a0)
  2806.     move.w    #28,28(a0)
  2807.     move.l    4.w,a6
  2808.     move.l    a0,a1
  2809.     tst.w    d3
  2810.     beq    DS_3
  2811.     jsr    _LVOSendIO(a6)
  2812.     bra    DS_E
  2813. DS_3    jsr    _LVODoIO(a6)
  2814.     tst.w    28(a4)
  2815.     beq    DS_E
  2816.     move.l    22(a4),a0
  2817.     lea    Req_SCSIArgs(pc),a1
  2818.     move.l    a3,(a1)
  2819.     move.l    a1,a3
  2820.     lea    SenseKeys(pc),a1
  2821.     moveq    #0,d0
  2822.     move.b    2(a0),d0
  2823.     andi.b    #$0f,d0
  2824.     move.l    (a1,d0.w*4),4(a3)
  2825.     lea    Req_AddName(pc),a1
  2826.     move.l    a1,8(a3)
  2827.     cmpi.b    #6,7(a0)
  2828.     bcs    DS_4
  2829.     lea    ErrorTable(pc),a1
  2830.     move.w    12(a0),d0
  2831. DS_5    cmp.w    (a1),d0
  2832.     beq    DS_5a
  2833.     cmpi.w    #$ffff,(a1)
  2834.     beq    DS_5a
  2835.     lea    6(a1),a1
  2836.     bra    DS_5
  2837. DS_5a    move.l    2(a1),8(a3)
  2838. DS_4    suba.l    a0,a0
  2839.     lea    Req_SCSIErr(pc),a1
  2840.     suba.l    a2,a2
  2841.     move.l    _IntuitionBase,a6
  2842.     jsr    _LVOEasyRequestArgs(a6)
  2843.     tst.l    d0
  2844.     beq    DS_E
  2845.     movem.l    (sp)+,d0-d7/a0-a6
  2846.     bra    DS_1
  2847. DS_E    move.l    8(a4),Scsi_Ret
  2848.     movem.l    (sp)+,d0-d7/a0-a6
  2849.     move.l    Scsi_Ret(pc),d0
  2850.     rts
  2851.     
  2852. Req_SCSIErr    dc.l    20,0,Req_SCSIt1,Req_SCSIt2,Req_SCSIt3
  2853. Req_SCSIArgs    dc.l    0,0,0,0
  2854. Req_SCSIt1    dc.b    'SCSI error',0
  2855. Req_SCSIt2    dc.b    'SCSI unit reports error while %s',$0a,'%s: %s',0
  2856. Req_SCSIt3    dc.b    'Retry|Cancel',0
  2857. Req_AddName    dc.b    'NO ADDITIONAL ERROR CODE',0
  2858. Scsi_Ret    dc.l    0
  2859.  
  2860.     cnop    0,4
  2861.  
  2862. SenseKeys    dc.l    sk1,sk2,sk3,sk4
  2863.         dc.l    sk5,sk6,sk7,sk8
  2864.         dc.l    sk9,sk10,sk11,12
  2865.         dc.l    sk13,sk14,sk15,sk16
  2866.  
  2867. sk1        dc.b    'NO SENSE',0
  2868. sk2        dc.b    'RECOVERED ERROR',0
  2869. sk3        dc.b    'NOT READY',0
  2870. sk4        dc.b    'MEDIUM ERROR',0
  2871. sk5        dc.b    'HARDWARE ERRROR',0
  2872. sk6        dc.b    'ILLEGAL REQUEST',0
  2873. sk7        dc.b    'UNIT ATTENTION',0
  2874. sk8        dc.b    'DATA PROTECT',0
  2875. sk9        dc.b    'BLANK CHECK',0
  2876. sk10        dc.b    'VENDOR-SPECIFIC',0
  2877. sk11        dc.b    'COPY ABORTED',0
  2878. sk12        dc.b    'ABORTED COMMAND',0
  2879. sk13        dc.b    'EQUAL',0
  2880. sk14        dc.b    'VOLUME OVERFLOW',0
  2881. sk15        dc.b    'MISCOMPARE',0
  2882. sk16        dc.b    'RESERVED',0
  2883.  
  2884.     cnop    0,4
  2885.  
  2886. ErrorTable
  2887.  
  2888.         dc.w    $1300
  2889.         dc.l    er1
  2890.         dc.w    $1200
  2891.         dc.l    er2
  2892.         dc.w    $0011
  2893.         dc.l    er3
  2894.         dc.w    $0012
  2895.         dc.l    er4
  2896.         dc.w    $0014
  2897.         dc.l    er5
  2898.         dc.w    $0013
  2899.         dc.l    er6
  2900.         dc.w    $0004
  2901.         dc.l    er7
  2902.         dc.w    $1404
  2903.         dc.l    er8
  2904.         dc.w    $3002
  2905.         dc.l    er9
  2906.         dc.w    $3001
  2907.         dc.l    er10
  2908.         dc.w    $5200
  2909.         dc.l    er11
  2910.         dc.w    $3F02
  2911.         dc.l    er12
  2912.         dc.w    $1106
  2913.         dc.l    er13
  2914.         dc.w    $3003
  2915.         dc.l    er14
  2916.         dc.w    $4A00
  2917.         dc.l    er15
  2918.         dc.w    $2C00
  2919.         dc.l    er16
  2920.         dc.w    $2F00
  2921.         dc.l    er17
  2922.         dc.w    $2B00
  2923.         dc.l    er18
  2924.         dc.w    $4100
  2925.         dc.l    er19
  2926.         dc.w    $4B00
  2927.         dc.l    er20
  2928.         dc.w    $1107
  2929.         dc.l    er21
  2930.         dc.w    $1600
  2931.         dc.l    er22
  2932.         dc.w    $1900
  2933.         dc.l    er23
  2934.         dc.w    $1903
  2935.         dc.l    er24
  2936.         dc.w    $1902
  2937.         dc.l    er25
  2938.         dc.w    $1901
  2939.         dc.l    er26
  2940.         dc.w    $1C00
  2941.         dc.l    er27
  2942.         dc.w    $3201
  2943.         dc.l    er28
  2944.         dc.w    $6300
  2945.         dc.l    er29
  2946.         dc.w    $0005
  2947.         dc.l    er30
  2948.         dc.w    $1403
  2949.         dc.l    er31
  2950.         dc.w    $0002
  2951.         dc.l    er32
  2952.         dc.w    $5100
  2953.         dc.l    er33
  2954.         dc.w    $0A00
  2955.         dc.l    er34
  2956.         dc.w    $1102
  2957.         dc.l    er35
  2958.         dc.w    $0302
  2959.         dc.l    er36
  2960.         dc.w    $3B07
  2961.         dc.l    er37
  2962.         dc.w    $3B06
  2963.         dc.l    er38
  2964.         dc.w    $0001
  2965.         dc.l    er39
  2966.         dc.w    $1402
  2967.         dc.l    er40
  2968.         dc.w    $0902
  2969.         dc.l    er41
  2970.         dc.w    $3101
  2971.         dc.l    er42
  2972.         dc.w    $5800
  2973.         dc.l    er43
  2974.         dc.w    $1C02
  2975.         dc.l    er44
  2976.         dc.w    $0006
  2977.         dc.l    er45
  2978.         dc.w    $1000
  2979.         dc.l    er46
  2980.         dc.w    $2200
  2981.         dc.l    er47
  2982.         dc.w    $6400
  2983.         dc.l    er48
  2984.         dc.w    $2801
  2985.         dc.l    er49
  2986.         dc.w    $3000
  2987.         dc.l    er50
  2988.         dc.w    $1108
  2989.         dc.l    er51
  2990.         dc.w    $4800
  2991.         dc.l    er52
  2992.         dc.w    $3F03
  2993.         dc.l    er53
  2994.         dc.w    $4400
  2995.         dc.l    er54
  2996.         dc.w    $3D00
  2997.         dc.l    er55
  2998.         dc.w    $2C02
  2999.         dc.l    er56
  3000.         dc.w    $2000
  3001.         dc.l    er57
  3002.         dc.w    $2101
  3003.         dc.l    er58
  3004.         dc.w    $2400
  3005.         dc.l    er59
  3006.         dc.w    $2600
  3007.         dc.l    er60
  3008.         dc.w    $4900
  3009.         dc.l    er61
  3010.         dc.w    $1105
  3011.         dc.l    er62
  3012.         dc.w    $6000
  3013.         dc.l    er63
  3014.         dc.w    $5B02
  3015.         dc.l    er64
  3016.         dc.w    $5B00
  3017.         dc.l    er65
  3018.         dc.w    $5B03
  3019.         dc.l    er66
  3020.         dc.w    $2A02
  3021.         dc.l    er67
  3022.         dc.w    $2100
  3023.         dc.l    er68
  3024.         dc.w    $0800
  3025.         dc.l    er69
  3026.         dc.w    $0802
  3027.         dc.l    er70
  3028.         dc.w    $0801
  3029.         dc.l    er71
  3030.         dc.w    $0500
  3031.         dc.l    er72
  3032.         dc.w    $4C00
  3033.         dc.l    er73
  3034.         dc.w    $3E00
  3035.         dc.l    er74
  3036.         dc.w    $0401
  3037.         dc.l    er75
  3038.         dc.w    $0400
  3039.         dc.l    er76
  3040.         dc.w    $0404
  3041.         dc.l    er77
  3042.         dc.w    $0402
  3043.         dc.l    er78
  3044.         dc.w    $0403
  3045.         dc.l    er79
  3046.         dc.w    $2500
  3047.         dc.l    er80
  3048.         dc.w    $1501
  3049.         dc.l    er81
  3050.         dc.w    $5300
  3051.         dc.l    er82
  3052.         dc.w    $3B0D
  3053.         dc.l    er83
  3054.         dc.w    $3100
  3055.         dc.l    er84
  3056.         dc.w    $3A00
  3057.         dc.l    er85
  3058.         dc.w    $5302
  3059.         dc.l    er86
  3060.         dc.w    $3B0E
  3061.         dc.l    er87
  3062.         dc.w    $4300
  3063.         dc.l    er88
  3064.         dc.w    $3F01
  3065.         dc.l    er89
  3066.         dc.w    $1D00
  3067.         dc.l    er90
  3068.         dc.w    $110A
  3069.         dc.l    er91
  3070.         dc.w    $2A01
  3071.         dc.l    er92
  3072.         dc.w    $0700
  3073.         dc.l    er93
  3074.         dc.w    $1103
  3075.         dc.l    er94
  3076.         dc.w    $0000
  3077.         dc.l    er95
  3078.         dc.w    $0015
  3079.         dc.l    er96
  3080.         dc.w    $3200
  3081.         dc.l    er97
  3082.         dc.w    $1109
  3083.         dc.l    er98
  3084.         dc.w    $0100
  3085.         dc.l    er99
  3086.         dc.w    $0600
  3087.         dc.l    er100
  3088.         dc.w    $0200
  3089.         dc.l    er101
  3090.         dc.w    $0301
  3091.         dc.l    er102
  3092.         dc.w    $2800
  3093.         dc.l    er103
  3094.         dc.w    $5A01
  3095.         dc.l    er104
  3096.         dc.w    $5A00
  3097.         dc.l    er105
  3098.         dc.w    $5A03
  3099.         dc.l    er106
  3100.         dc.w    $5A02
  3101.         dc.l    er107
  3102.         dc.w    $6102
  3103.         dc.l    er108
  3104.         dc.w    $4E00
  3105.         dc.l    er109
  3106.         dc.w    $2D00
  3107.         dc.l    er110
  3108.         dc.w    $3B05
  3109.         dc.l    er111
  3110.         dc.w    $1A00
  3111.         dc.l    er112
  3112.         dc.w    $2601
  3113.         dc.l    er113
  3114.         dc.w    $2602
  3115.         dc.l    er114
  3116.         dc.w    $2A00
  3117.         dc.l    er115
  3118.         dc.w    $0300
  3119.         dc.l    er116
  3120.         dc.w    $5002
  3121.         dc.l    er117
  3122.         dc.w    $3B0C
  3123.         dc.l    er118
  3124.         dc.w    $3B0B
  3125.         dc.l    er119
  3126.         dc.w    $1502
  3127.         dc.l    er120
  3128.         dc.w    $2900
  3129.         dc.l    er121
  3130.         dc.w    $4200
  3131.         dc.l    er122
  3132.         dc.w    $1C01
  3133.         dc.l    er123
  3134.         dc.w    $4000
  3135.         dc.l    er124
  3136.         dc.w    $1500
  3137.         dc.l    er125
  3138.         dc.w    $3B0A
  3139.         dc.l    er126
  3140.         dc.w    $3B09
  3141.         dc.l    er127
  3142.         dc.w    $1101
  3143.         dc.l    er128
  3144.         dc.w    $1401
  3145.         dc.l    er129
  3146.         dc.w    $1400
  3147.         dc.l    er130
  3148.         dc.w    $1802
  3149.         dc.l    er131
  3150.         dc.w    $1805
  3151.         dc.l    er132
  3152.         dc.w    $1705
  3153.         dc.l    er133
  3154.         dc.w    $1803
  3155.         dc.l    er134
  3156.         dc.w    $1801
  3157.         dc.l    er135
  3158.         dc.w    $1800
  3159.         dc.l    er136
  3160.         dc.w    $1804
  3161.         dc.l    er137
  3162.         dc.w    $1703
  3163.         dc.l    er138
  3164.         dc.w    $1700
  3165.         dc.l    er139
  3166.         dc.w    $1702
  3167.         dc.l    er140
  3168.         dc.w    $1701
  3169.         dc.l    er141
  3170.         dc.w    $1704
  3171.         dc.l    er142
  3172.         dc.w    $1706
  3173.         dc.l    er143
  3174.         dc.w    $1707
  3175.         dc.l    er144
  3176.         dc.w    $1E00
  3177.         dc.l    er145
  3178.         dc.w    $3B08
  3179.         dc.l    er146
  3180.         dc.w    $3600
  3181.         dc.l    er147
  3182.         dc.w    $3700
  3183.         dc.l    er148
  3184.         dc.w    $5C00
  3185.         dc.l    er149
  3186.         dc.w    $3900
  3187.         dc.l    er150
  3188.         dc.w    $6200
  3189.         dc.l    er151
  3190.         dc.w    $4700
  3191.         dc.l    er152
  3192.         dc.w    $5400
  3193.         dc.l    er153
  3194.         dc.w    $4500
  3195.         dc.l    er154
  3196.         dc.w    $3B00
  3197.         dc.l    er155
  3198.         dc.w    $0003
  3199.         dc.l    er156
  3200.         dc.w    $3B04
  3201.         dc.l    er157
  3202.         dc.w    $0903
  3203.         dc.l    er158
  3204.         dc.w    $5C02
  3205.         dc.l    er159
  3206.         dc.w    $5C01
  3207.         dc.l    er160
  3208.         dc.w    $1B00
  3209.         dc.l    er161
  3210.         dc.w    $5500
  3211.         dc.l    er162
  3212.         dc.w    $3300
  3213.         dc.l    er163
  3214.         dc.w    $3B03
  3215.         dc.l    er164
  3216.         dc.w    $3B01
  3217.         dc.l    er165
  3218.         dc.w    $3B02
  3219.         dc.l    er166
  3220.         dc.w    $3F00
  3221.         dc.l    er167
  3222.         dc.w    $5B01
  3223.         dc.l    er168
  3224.         dc.w    $2603
  3225.         dc.l    er169
  3226.         dc.w    $2C01
  3227.         dc.l    er170
  3228.         dc.w    $0900
  3229.         dc.l    er171
  3230.         dc.w    $0901
  3231.         dc.l    er172
  3232.         dc.w    $6101
  3233.         dc.l    er173
  3234.         dc.w    $5700
  3235.         dc.l    er174
  3236.         dc.w    $5301
  3237.         dc.l    er175
  3238.         dc.w    $1100
  3239.         dc.l    er176
  3240.         dc.w    $1104
  3241.         dc.l    er177
  3242.         dc.w    $110B
  3243.         dc.l    er178
  3244.         dc.w    $110C
  3245.         dc.l    er179
  3246.         dc.w    $4600
  3247.         dc.l    er180
  3248.         dc.w    $5900
  3249.         dc.l    er181
  3250.         dc.w    $6100
  3251.         dc.l    er182
  3252.         dc.w    $5000
  3253.         dc.l    er183
  3254.         dc.w    $5001
  3255.         dc.l    er184
  3256.         dc.w    $0C00
  3257.         dc.l    er185
  3258.         dc.w    $0C02
  3259.         dc.l    er186
  3260.         dc.w    $0C01
  3261.         dc.l    er187
  3262.         dc.w    $2700
  3263.         dc.l    er188
  3264.         dc.w    $FFFF
  3265.         dc.l    er188
  3266.  
  3267. er1        dc.b    'ADDRESS MARK NOT FOUND FOR DATA FIELD',0
  3268. er2        dc.b    'ADDRESS MARK NOT FOUND FOR ID FIELD',0
  3269. er3        dc.b    'AUDIO PLAY OPERATION IN PROGRESS',0
  3270. er4        dc.b    'AUDIO PLAY OPERATION PAUSED',0
  3271. er5        dc.b    'AUDIO PLAY OPERATION STOPPED DUE TO ERROR',0
  3272. er6        dc.b    'AUDIO PLAY OPERATION SUCCESSFULLY COMPLETED',0
  3273. er7        dc.b    'BEGINNING-OF-PARTITION/MEDIUM DETECTED',0
  3274. er8        dc.b    'BLOCK SEQUENCE ERROR',0
  3275. er9        dc.b    'CANNOT READ MEDIUM - INCOMPATIBLE FORMAT',0
  3276. er10        dc.b    'CANNOT READ MEDIUM - UNKNOWN FORMAT',0
  3277. er11        dc.b    'CARTRIDGE FAULT',0
  3278. er12        dc.b    'CHANGED OPERATING DEFINITION',0
  3279. er13        dc.b    'CIRC UNRECOVERED ERROR',0
  3280. er14        dc.b    'CLEANING CARTRIDGE INSTALLED',0
  3281. er15        dc.b    'COMMAND PHASE ERROR',0
  3282. er16        dc.b    'COMMAND SEQUENCE ERROR',0
  3283. er17        dc.b    'COMMANDS CLEARED BY ANOTHER INITIATOR',0
  3284. er18        dc.b    'COPY CANNOT EXECUTE SINCE HOST CANNOT DISCONNECT',0
  3285. er19        dc.b    'DATA PATH FAILURE',0
  3286. er20        dc.b    'DATA PHASE ERROR',0
  3287. er21        dc.b    'DATA RESYCHRONIZATION ERROR',0
  3288. er22        dc.b    'DATA SYNCHRONIZATION MARK ERROR',0
  3289. er23        dc.b    'DEFECT LIST ERROR',0
  3290. er24        dc.b    'DEFECT LIST ERROR IN GROWN LIST',0
  3291. er25        dc.b    'DEFECT LIST ERROR IN PRIMARY LIST',0
  3292. er26        dc.b    'DEFECT LIST NOT AVAILABLE',0
  3293. er27        dc.b    'DEFECT LIST NOT FOUND',0
  3294. er28        dc.b    'DEFECT LIST UPDATE FAILURE',0
  3295. er29        dc.b    'END OF USER AREA ENCOUNTERED ON THIS TRACK',0
  3296. er30        dc.b    'END-OF-DATA DETECTED',0
  3297. er31        dc.b    'END-OF-DATA NOT FOUND',0
  3298. er32        dc.b    'END-OF-PARTITION/MEDIUM DETECTED',0
  3299. er33        dc.b    'ERASE FAILURE',0
  3300. er34        dc.b    'ERROR LOG OVERFLOW',0
  3301. er35        dc.b    'ERROR TOO LONG TO CORRECT',0
  3302. er36        dc.b    'EXCESSIVE WRITE ERRORS',0
  3303. er37        dc.b    'FAILED TO SENSE BOTTOM-OF-FORM',0
  3304. er38        dc.b    'FAILED TO SENSE TOP-OF-FORM',0
  3305. er39        dc.b    'FILEMARK DETECTED',0
  3306. er40        dc.b    'FILEMARK OR SETMARK NOT FOUND',0
  3307. er41        dc.b    'FOCUS SERVO FAILURE',0
  3308. er42        dc.b    'FORMAT COMMAND FAILED',0
  3309. er43        dc.b    'GENERATION DOES NOT EXIST',0
  3310. er44        dc.b    'GROWN DEFECT LIST NOT FOUND',0
  3311. er45        dc.b    'I/O PROCESS TERMINATED',0
  3312. er46        dc.b    'ID CRC OR ECC ERROR',0
  3313. er47        dc.b    'ILLEGAL FUNCTION',0
  3314. er48        dc.b    'ILLEGAL MODE FOR THIS TRACK',0
  3315. er49        dc.b    'IMPORT OR EXPORT ELEMENT ACCESSED',0
  3316. er50        dc.b    'INCOMPATIBLE MEDIUM INSTALLED',0
  3317. er51        dc.b    'INCOMPLETE BLOCK READ',0
  3318. er52        dc.b    'INITIATOR DETECTED ERROR MESSAGE RECEIVED',0
  3319. er53        dc.b    'INQUIRY DATA HAS CHANGED',0
  3320. er54        dc.b    'INTERNAL TARGET FAILURE',0
  3321. er55        dc.b    'INVALID BITS IN IDENTIFY MESSAGE',0
  3322. er56        dc.b    'INVALID COMBINATION OF WINDOWS SPECIFIED',0
  3323. er57        dc.b    'INVALID COMMAND OPERATION CODE',0
  3324. er58        dc.b    'INVALID ELEMENT ADDRESS',0
  3325. er59        dc.b    'INVALID FIELD IN CDB',0
  3326. er60        dc.b    'INVALID FIELD IN PARAMETER LIST',0
  3327. er61        dc.b    'INVALID MESSAGE ERROR',0
  3328. er62        dc.b    'L-EC UNCORRECTABLE ERROR',0
  3329. er63        dc.b    'LAMP FAILURE',0
  3330. er64        dc.b    'LOG COUNTER AT MAXIMUM',0
  3331. er65        dc.b    'LOG EXCEPTION',0
  3332. er66        dc.b    'LOG LIST CODES EXHAUSTED',0
  3333. er67        dc.b    'LOG PARAMETERS CHANGED',0
  3334. er68        dc.b    'LOGICAL BLOCK ADDRESS OUT OF RANGE',0
  3335. er69        dc.b    'LOGICAL UNIT COMMUNICATION FAILURE',0
  3336. er70        dc.b    'LOGICAL UNIT COMMUNICATION PARITY ERROR',0
  3337. er71        dc.b    'LOGICAL UNIT COMMUNICATION TIME-OUT',0
  3338. er72        dc.b    'LOGICAL UNIT DOES NOT RESPOND TO SELECTION',0
  3339. er73        dc.b    'LOGICAL UNIT FAILED SELF-CONFIGURATION',0
  3340. er74        dc.b    'LOGICAL UNIT HAS NOT SELF-CONFIGURED YET',0
  3341. er75        dc.b    'LOGICAL UNIT IS IN PROCESS OF BECOMING READY',0
  3342. er76        dc.b    'LOGICAL UNIT NOT READY, CAUSE NOT REPORTABLE',0
  3343. er77        dc.b    'LOGICAL UNIT NOT READY, FORMAT IN PROGRESS',0
  3344. er78        dc.b    'LOGICAL UNIT NOT READY, INITIALIZING COMMAND REQUIRED',0
  3345. er79        dc.b    'LOGICAL UNIT NOT READY, MANUAL INTERVENTION REQUIRED',0
  3346. er80        dc.b    'LOGICAL UNIT NOT SUPPORTED',0
  3347. er81        dc.b    'MECHANICAL POSITIONING ERROR',0
  3348. er82        dc.b    'MEDIA LOAD OR EJECT FAILED',0
  3349. er83        dc.b    'MEDIUM DESTINATION ELEMENT FULL',0
  3350. er84        dc.b    'MEDIUM FORMAT CORRUPTED',0
  3351. er85        dc.b    'MEDIUM NOT PRESENT',0
  3352. er86        dc.b    'MEDIUM REMOVAL PREVENTED',0
  3353. er87        dc.b    'MEDIUM SOURCE ELEMENT EMPTY',0
  3354. er88        dc.b    'MESSAGE ERROR',0
  3355. er89        dc.b    'MICROCODE HAS BEEN CHANGED',0
  3356. er90        dc.b    'MISCOMPARE DURING VERIFY OPERATION',0
  3357. er91        dc.b    'MISCORRECTED ERROR',0
  3358. er92        dc.b    'MODE PARAMETERS CHANGED',0
  3359. er93        dc.b    'MULTIPLE PERIPHERAL DEVICES SELECTED',0
  3360. er94        dc.b    'MULTIPLE READ ERRORS',0
  3361. er95        dc.b    'NO ADDITIONAL SENSE INFORMATION',0
  3362. er96        dc.b    'NO CURRENT AUDIO STATUS TO RETURN',0
  3363. er97        dc.b    'NO DEFECT SPARE LOCATION AVAILABLE',0
  3364. er98        dc.b    'NO GAP FOUND',0
  3365. er99        dc.b    'NO INDEX/SECTOR SIGNAL',0
  3366. er100        dc.b    'NO REFERENCE POSITION FOUND',0
  3367. er101        dc.b    'NO SEEK COMPLETE',0
  3368. er102        dc.b    'NO WRITE CURRENT',0
  3369. er103        dc.b    'NOT READY TO READY TRANSITION (MEDIUM MAY HAVE CHANGED)',0
  3370. er104        dc.b    'OPERATOR MEDIUM REMOVAL REQUEST',0
  3371. er105        dc.b    'OPERATOR REQUEST OR STATE CHANGE INPUT (UNSPECIFIED)',0
  3372. er106        dc.b    'OPERATOR SELECTED WRITE PERMIT',0
  3373. er107        dc.b    'OPERATOR SELECTED WRITE PROTECT',0
  3374. er108        dc.b    'OUT OF FOCUS',0
  3375. er109        dc.b    'OVERLAPPED COMMANDS ATTEMPTED',0
  3376. er110        dc.b    'OVERWRITE ERROR ON UPDATE IN PLACE',0
  3377. er111        dc.b    'PAPER JAM',0
  3378. er112        dc.b    'PARAMETER LIST LENGTH ERROR',0
  3379. er113        dc.b    'PARAMETER NOT SUPPORTED',0
  3380. er114        dc.b    'PARAMETER VALUE INVALID',0
  3381. er115        dc.b    'PARAMETERS CHANGED',0
  3382. er116        dc.b    'PERIPHERAL DEVICE WRITE FAULT',0
  3383. er117        dc.b    'POSITION ERROR RELATED TO TIMING',0
  3384. er118        dc.b    'POSITION PAST BEGINNING OF MEDIUM',0
  3385. er119        dc.b    'POSITION PAST END OF MEDIUM',0
  3386. er120        dc.b    'POSITIONING ERROR DETECTED BY READ OF MEDIUM',0
  3387. er121        dc.b    'POWER ON, RESET, OR BUS DEVICE RESET OCCURRED',0
  3388. er122        dc.b    'POWER-ON OR SELF-TEST FAILURE',0
  3389. er123        dc.b    'PRIMARY DEFECT LIST NOT FOUND',0
  3390. er124        dc.b    'RAM FAILURE',0
  3391. er125        dc.b    'RANDOM POSITIONING ERROR',0
  3392. er126        dc.b    'READ PAST BEGINNING OF MEDIUM',0
  3393. er127        dc.b    'READ PAST END OF MEDIUM',0
  3394. er128        dc.b    'READ RETRIES EXHAUSTED',0
  3395. er129        dc.b    'RECORD NOT FOUND',0
  3396. er130        dc.b    'RECORDED ENTITY NOT FOUND',0
  3397. er131        dc.b    'RECOVERED DATA - DATA AUTO-REALLOCATED',0
  3398. er132        dc.b    'RECOVERED DATA - RECOMMEND REASSIGNMENT',0
  3399. er133        dc.b    'RECOVERED DATA USING PREVIOUS SECTOR ID',0
  3400. er134        dc.b    'RECOVERED DATA WITH CIRC',0
  3401. er135        dc.b    'RECOVERED DATA WITH ERROR CORRECTION AND RETRIES APPLIED',0
  3402. er136        dc.b    'RECOVERED DATA WITH ERROR CORRECTION APPLIED',0
  3403. er137        dc.b    'RECOVERED DATA WITH LEC',0
  3404. er138        dc.b    'RECOVERED DATA WITH NEGATIVE HEAD OFFSET',0
  3405. er139        dc.b    'RECOVERED DATA WITH NO ERROR CORRECTION APPLIED',0
  3406. er140        dc.b    'RECOVERED DATA WITH POSITIVE HEAD OFFSET',0
  3407. er141        dc.b    'RECOVERED DATA WITH RETRIES',0
  3408. er142        dc.b    'RECOVERED DATA WITH RETRIES AND/OR CIRC APPLIED',0
  3409. er143        dc.b    'RECOVERED DATA WITHOUT ECC - DATA AUTO-REALLOCATED',0
  3410. er144        dc.b    'RECOVERED DATA WITHOUT ECC - RECOMMEND REASSIGNMENT',0
  3411. er145        dc.b    'RECOVERED ID WITH ECC CORRECTION',0
  3412. er146        dc.b    'REPOSITION ERROR',0
  3413. er147        dc.b    'RIBBON, INK, OR TONER FAILURE',0
  3414. er148        dc.b    'ROUNDED PARAMETER',0
  3415. er149        dc.b    'RPL STATUS CHANGE',0
  3416. er150        dc.b    'SAVING PARAMETERS NOT SUPPORTED',0
  3417. er151        dc.b    'SCAN HEAD POSITIONING ERROR',0
  3418. er152        dc.b    'SCSI PARITY ERROR',0
  3419. er153        dc.b    'SCSI TO HOST SYSTEM INTERFACE FAILURE',0
  3420. er154        dc.b    'SELECT OR RESELECT FAILURE',0
  3421. er155        dc.b    'SEQUENTIAL POSITIONING ERROR',0
  3422. er156        dc.b    'SETMARK DETECTED',0
  3423. er157        dc.b    'SLEW FAILURE',0
  3424. er158        dc.b    'SPINDLE SERVO FAILURE',0
  3425. er159        dc.b    'SPINDLES NOT SYNCHRONIZED',0
  3426. er160        dc.b    'SPINDLES SYNCHRONIZED',0
  3427. er161        dc.b    'SYNCHRONOUS DATA TRANSFER ERROR',0
  3428. er162        dc.b    'SYSTEM RESOURCE FAILURE',0
  3429. er163        dc.b    'TAPE LENGTH ERROR',0
  3430. er164        dc.b    'TAPE OR ELECTRONIC VERTICAL FORMS UNIT NOT READY',0
  3431. er165        dc.b    'TAPE POSITION ERROR AT BEGINNING-OF-MEDIUM',0
  3432. er166        dc.b    'TAPE POSITION ERROR AT END-OF-MEDIUM',0
  3433. er167        dc.b    'TARGET OPERATING CONDITIONS HAVE CHANGED',0
  3434. er168        dc.b    'THRESHOLD CONDITION MET',0
  3435. er169        dc.b    'THRESHOLD PARAMETERS NOT SUPPORTED',0
  3436. er170        dc.b    'TOO MANY WINDOWS SPECIFIED',0
  3437. er171        dc.b    'TRACK FOLLOWING ERROR',0
  3438. er172        dc.b    'TRACKING SERVO FAILURE',0
  3439. er173        dc.b    'UNABLE TO ACQUIRE VIDEO',0
  3440. er174        dc.b    'UNABLE TO RECOVER TABLE-OF-CONTENTS',0
  3441. er175        dc.b    'UNLOAD TAPE FAILURE',0
  3442. er176        dc.b    'UNRECOVERED READ ERROR',0
  3443. er177        dc.b    'UNRECOVERED READ ERROR - AUTO REALLOCATE FAILED',0
  3444. er178        dc.b    'UNRECOVERED READ ERROR - RECOMMEND REASSIGNMENT',0
  3445. er179        dc.b    'UNRECOVERED READ ERROR - RECOMMEND REWRITE THE DATA',0
  3446. er180        dc.b    'UNSUCCESSFUL SOFT RESET',0
  3447. er181        dc.b    'UPDATED BLOCK READ',0
  3448. er182        dc.b    'VIDEO ACQUISITION ERROR',0
  3449. er183        dc.b    'WRITE APPEND ERROR',0
  3450. er184        dc.b    'WRITE APPEND POSITION ERROR',0
  3451. er185        dc.b    'WRITE ERROR',0
  3452. er186        dc.b    'WRITE ERROR - AUTO REALLOCATION FAILED',0
  3453. er187        dc.b    'WRITE ERROR RECOVERED WITH AUTO REALLOCATION',0
  3454. er188        dc.b    'WRITE PROTECTED',0
  3455. er189        dc.b    'UNKNOWN ERROR CODE',0
  3456.  
  3457.  
  3458.     section resource_data,bss
  3459.     
  3460. textArea    ds.b    200
  3461. textAreaB    ds.b    100
  3462.  
  3463. OldModePage    ds.b    12